我偶然发现了一个我从未想过的问题。 这里是: 将触发每个对象(在初始化列表中列出)“构造函数”。
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的复制构造函数。 为什么不是构造函数而是复制构造函数?
答案 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
。这解释了一切。