[C++]:关于构造函数中的启动列表的问题
[c++]: problem about initiation list in constructor
我偶然发现了一个我以前从未想过的问题。在这里:每个对象的(列在初始化列表中(的">构造函数"将被触发。
class B
{
public:
B() { cout<<"B Conn";}
B(const B &b) { cout<<"B Copy Conn";}
};
class A
{
public:
A(B &b):_m(b) { cout<<"A Conn";}
A(const A &a):_m(a._m) { cout<<"A Copy Conn";}
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 的复制构造函数。为什么不是构造函数而是复制构造函数?
原因是当你打电话的时候
_m( whatever )
然后是复制构造函数
B(const B &b)
是唯一可以匹配参数列表的。您向其传递一个参数,该参数的类型为 class B
。
复制构造函数并不是超级特别的东西 - 它只是一个参数化的构造函数,一旦参数列表匹配,就会通过初始化列表调用。
因为你告诉编译器用b
初始化_m
,怎么会不调用复制构造函数呢?
答案在于使用复制构造函数实例化 B _m A(B &b):_m(b)
。
相反,如果您这样做A(B &b):_m()
它将使用默认构造函数。
A(B &b):_m(b) { cout<<"A Conn";}
在这里_m(b)
导致调用 B 的复制构造函数B(const B&)
。这就是为什么,它在初始化_m
时首先打印B Copy Con
,然后进入 A 的构造函数主体,并打印A Con
。这解释了一切。
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 如何创建一个空的全局类并在启动时实例化它
- 使用简单类型列表实现的指数编译时间.为什么
- CMake 库目标并不总是出现在 Visual Studio 2017 的"启动项"下拉列表中。
- 在QT中启动程序时如何创建列表或对象
- 重载>>运算符并使用自定义类型的初始值设定项列表启动
- C++列表迭代器如果列表更改则重新启动操作
- 邮件程序启动时如何快速显示邮件列表
- 构造函数中成员启动列表的计算顺序
- [C++]:关于构造函数中的启动列表的问题
- 在C++链接列表中帮助.show记录功能启动无限循环
- 在参数列表中使用绝对路径启动QProcess