[c ++]: проблема с списком инициализации в конструкторе - PullRequest
0 голосов
/ 23 августа 2011

Я наткнулся на вопрос, о котором никогда раньше не думал. Вот: каждый объект (указанный в списке инициализации) " constructor " будет запущен.

class B
{
    public:
        B() { cout<<"B Con\n";}
        B(const B &b) { cout<<"B Copy Con\n";}
};

class A
{
    public:
        A(B &b):_m(b) { cout<<"A Con\n";}
        A(const A &a):_m(a._m) { cout<<"A Copy Con\n";}
    private:
        B _m;
}

main()
{
    B b;
    A a(b);
}

тогда я получил вывод следующим образом:

B Con
B Copy Con
A Con

В соответствии с выводом, я думаю, 'A a (b)' запустил конструктор копирования B. Если я понял правильно, то это означает, что «A (B & b): _ m (b)» запускает конструктор копирования B . Почему не конструктор, а конструктор копирования?

Ответы [ 4 ]

1 голос
/ 23 августа 2011

Ответ лежит в A(B &b):_m(b) Вы создаете экземпляр B _m с помощью конструктора копирования.

Если бы вместо этого вы сделали A(B &b):_m(), он использовал бы конструктор по умолчанию.

1 голос
/ 23 августа 2011

Причина в том, что когда вы вызываете

_m( whatever )

, тогда конструктор копирования

B(const B &b)

является единственным, который может соответствовать списку параметров.Вы передаете ему один параметр, и этот параметр имеет тип class B.

Конструктор копирования не является чем-то сверхспециальным - это просто параметризованный конструктор, который будет вызываться через список инициализации при совпадении списка параметров.

1 голос
/ 23 августа 2011

Поскольку вы говорите компилятору инициализировать _m с b, как бы это не вызвало конструктор копирования?

0 голосов
/ 23 августа 2011
A(B &b):_m(b) { cout<<"A Con\n";}

Здесь _m(b) вызывает вызов B(const B&), который является конструктором копирования B.Поэтому сначала он печатает B Copy Con при инициализации _m, затем входит в тело конструктора А и печатает A Con.Это все объясняет.

...