C ++ неявного вызова конструктора класса члена при инициализации экземпляра класса

голоса
0

Я все еще учусь красота C ++. Я наткнулся на какой-то код сегодня и, надеюсь, кто-то может дать мне некоторые рекомендации. У меня есть 2 классов

class B
{
public:
    B( std::string s )
        : m_string( s )
    {
    }

private:
    std::string m_string;
};

class A
{
public:
    A( B b )
        : m_b( b )
    {
    }

private:
    B m_b;
};

main.cpp

A a = A(std::string(hello));

Я немного запутался о том , как может такая инициализация работы? Как компилятор знает , что std::string(hello)должно быть принято в конструктор B вместо?

Я пытался найти соответствующую документацию, но не повезло ..

Задан 20/10/2018 в 05:07
источник пользователем
На других языках...                            


1 ответов

голоса
2

Когда класс имеет конструктор , принимающий один аргумент, что конструктор может быть использован для неявно преобразовать этот аргумент к экземпляру этого класса. Это означает , что везде , где Bтребуется, ваш B( std::string s )конструктор позволяет перейти строку вместо.

Если вы хотите , чтобы ингибировать это неявное преобразование, вы пишете explicit B( std::string s ). Некоторые люди считают , это хорошая практика для большинства Конструкторы с одним аргументом.

Ответил 20/10/2018 в 05:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more