复制构造函数调用方法

时间:2014-09-14 11:52:00

标签: c++ initialization copy-constructor

#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) ;都会调用复制构造函数。

使用其中一个的优点和缺点是什么?

1 个答案:

答案 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)称为直接初始化