复制构造函数调用方法

Tas*_*man 1 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 ;
}
Run Code Online (Sandbox Code Playgroud)

如果我是正确的,都Foo obj2 = obj ;Foo obj1(obj) ;调用拷贝构造函数.

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

T.C*_*.C. 5

Foo obj1(obj);是直接初始化,Foo obj2 = obj;是复制初始化.

这里唯一的区别是第一个可以调用explicit构造函数而第二个不能.

但是,没有理智的人会制作复制构造函数explicit,因此假设您正在使用理智的代码,它应该没有任何区别.具有显式复制构造函数的类不满足CopyConstructible要求(许多标准容器操作都需要).函数返回和参数传递都使用复制初始化,因此具有显式复制构造函数的类在这些上下文中不可用.


只是为了让事情变得清晰.N3936§8.5[dcl.init]/p15-16:

15表单中发生的初始化

T x = a;
Run Code Online (Sandbox Code Playgroud)

以及参数传递,函数返回,抛出异常(15.1),处理异常(15.3)和聚合成员初始化(8.5.1)称为复制初始化.[ 注意:复制初始化可以调用移动(12.8).- 结束说明 ]

16表单中发生的初始化

T x(a);
T x{a};
Run Code Online (Sandbox Code Playgroud)

new表达式(5.3.4)中,static_cast表达式(5.2.9),函数表示法类型转换(5.2.3)以及基本和成员初始化器(12.6.2)称为直接初始化.

  • @PaulEvans这里唯一不对的是你声称`Foo obj1(obj);`是复制初始化.从您完全误读*的标准中粘贴格式错误的摘录并不会改变这一事实. (3认同)