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) ;调用拷贝构造函数.
使用其中一个的优点和缺点是什么?
Foo obj1(obj);是直接初始化,Foo obj2 = obj;是复制初始化.
这里唯一的区别是第一个可以调用explicit构造函数而第二个不能.
但是,没有理智的人会制作复制构造函数explicit,因此假设您正在使用理智的代码,它应该没有任何区别.具有显式复制构造函数的类不满足CopyConstructible要求(许多标准容器操作都需要).函数返回和参数传递都使用复制初始化,因此具有显式复制构造函数的类在这些上下文中不可用.
只是为了让事情变得清晰.N3936§8.5[dcl.init]/p15-16:
15表单中发生的初始化
Run Code Online (Sandbox Code Playgroud)T x = a;以及参数传递,函数返回,抛出异常(15.1),处理异常(15.3)和聚合成员初始化(8.5.1)称为复制初始化.[ 注意:复制初始化可以调用移动(12.8).- 结束说明 ]
16表单中发生的初始化
Run Code Online (Sandbox Code Playgroud)T x(a); T x{a};在
new表达式(5.3.4)中,static_cast表达式(5.2.9),函数表示法类型转换(5.2.3)以及基本和成员初始化器(12.6.2)称为直接初始化.
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |