#include<iostream>
using namespace std ;
class Foo{
int a , b ;
public:
Foo(int x, int y){
a = x ;
b = y ;
}
Foo(Foo& obj){
a = obj.a ;
b = obj.b ;
}
};
int main(){
Foo obj(2,3) ;
Foo obj1(obj) ;
Foo obj2 = obj ;
}
如果我是对的,Foo obj2 = obj ;
和Foo obj1(obj) ;
都会调用复制构造函数。
使用其中一个的优点和缺点是什么?
答案 0 :(得分:5)
Foo obj1(obj);
是直接初始化,Foo obj2 = obj;
是复制初始化。
唯一的区别是第一个可以调用explicit
构造函数,而第二个不能。{/ p>
然而,没有理智的人会制作复制构造函数explicit
,因此假设您正在使用理智的代码,它应该没有任何区别。具有显式复制构造函数的类不满足CopyConstructible
要求(许多标准容器操作都需要)。函数返回和参数传递都使用复制初始化,因此具有显式复制构造函数的类在这些上下文中不可用。
只是为了让事情变得清晰。 N3936§8.5[dcl.init] / p15-16:
15表单中出现的初始化
T x = a;
以及在参数传递,函数返回,抛出异常 (15.1),处理异常(15.3)和聚合成员 初始化(8.5.1)称为复制初始化。 [注意: 复制初始化可以调用移动(12.8)。 - 结束记录]
16表单中出现的初始化
T x(a); T x{a};
以及
new
表达式(5.3.4),static_cast
表达式 (5.2.9),功能符号类型转换(5.2.3),基数和 成员初始值设定项(12.6.2)称为直接初始化。