关于c++复制构造函数调用的问题
Question regarding C++ Copy Constructor call
我想弄清楚这两行代码之间的区别。
我们给定'Count'是类名,C1和C2是该类的对象。没有给出如何以及何时声明类的信息。
Count C2(C1); //Statement 1
Count C2=C1; //Statement 2
没有给出其他信息。复制构造函数的这两行调用有什么区别?如果你有答案,请详细说明。
谢谢!
在语法层面上,第一种称为"直接初始化",第二种称为"复制初始化"。如果Count
是类类型(例如,不是int
的typedef),则两个版本都同样会导致调用复制构造函数。
第一个版本在任何情况下都有效,如果复制构造函数声明为explicit
,则第二个版本不起作用
在语句1中,C2将使用复制构造函数从C1构造自己。
在语句2中,C2将使用复制构造函数从C1构造自己,如果没有可用的复制构造函数,则使用-或-默认构造自己,然后使用C1的赋值操作符为自己赋值。我不认为语句1有这个选项
复制初始化
Count C2=C1; //Statement 2
Copy初始化构造了一个隐式转换序列:它试图将C1
转换为Count
类型的对象。如果在复制构造函数中使用explicit
关键字,则该关键字将被抑制,编译器将发出错误。
直接初始化
Count C2(C1); //Statement 1
直接初始化的行为类似于对Count
(包括显式的)构造函数的函数调用,并且参数是传递给被调用构造函数的c1
。重载解析将找到最佳匹配的构造函数,并在需要时执行所需的任何隐式转换。
编译器认为它们是相同的。
Count C2 = Count(C1);
Count C2(C1);
Count C2 = C1;
它们都将调用复制构造函数
但是这是不一样的:
Count C2;
C2 = C1;
将使用默认构造函数构造C2,然后使用operator=
将C1赋值给它。
相关文章:
- 将值推送到 getter 函数调用的列表中时出现问题
- 在C++中实现类似 python "map"函数的问题:调用类成员函数
- 使用另一个函数调用一个函数(都在类中)时出现问题.没有错误代码C++
- 关于C++从派生类调用在基类中实现的虚拟函数的问题
- 从 Qt 中的信号调用成员函数的问题
- 我正在尝试解决调用没有匹配函数的问题
- 调用模板函数的问题"No matching function for call"参数:迭代器、对象函数
- 头文件会导致函数调用后原始数组出现问题
- OVerload函数调用问题
- 尝试构造包装器测量函数调用时间时出现问题
- 试图在具有std ::任何构造函数的基类中调用复制构造函数的问题
- C++ 嵌套构造函数调用问题
- 构造函数调用问题
- 关于从C++调用C#函数的问题,在windows phone上反向P/Invoke
- 将C++中涉及数组的函数调用转换为C#时出现问题
- 如何修复对strstr没有匹配函数调用的问题
- 通过初始化列表调用另一个类的构造函数.有问题
- 推导函数调用时出现歧义问题
- 调用接受三个参数的函数出现问题,其中一个是 int const
- 函数调用出现问题