[c ++]:关于构造函数中的启动列表的问题

时间:2011-08-23 11:49:47

标签: c++ copy-constructor initializer-list

我偶然发现了一个我从未想过的问题。 这里是: 将触发每个对象(在初始化列表中列出)“构造函数”。

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&amp; b):_ m(b)'触发B的复制构造函数。 为什么不是构造函数而是复制构造函数?

4 个答案:

答案 0 :(得分:1)

原因是你打电话

_m( whatever )

然后是复制构造函数

B(const B &b)

是唯一可以匹配参数列表的人。您传递一个参数,该参数的类型为class B

复制构造函数不是特别的东西 - 它只是一个参数化构造函数,一旦参数列表匹配,它将通过初始化列表调用。

答案 1 :(得分:1)

因为您告诉编译器使用_m初始化b,如何不调用复制构造函数?

答案 2 :(得分:1)

答案在于A(B &b):_m(b)您正在使用复制构造函数实例化B _m。

如果你改为A(B &b):_m(),它将使用默认构造函数。

答案 3 :(得分:0)

A(B &b):_m(b) { cout<<"A Con\n";}

这里_m(b)导致B(const B&)的调用,这是B的复制构造函数。这就是为什么它在初始化B Copy Con时首先打印_m,然后它进入A的构造函数体,并打印A Con。这解释了一切。