1、拷贝构造函数
如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数是拷贝构造函数。
C(const C &);//参数通常是const的引用
拷贝构造函数在下列情况下发生:
- 拷贝初始化时使用(=定义变量)。
- 将一个对象作为实参传递给一个非引用类型的形参。
- 从一个返回类型为非引用类型的函数返回一个对象。
- 用花括号列表初始化一个数组中的元素或一个聚合类中的成员。
拷贝构造函数的参数必须是引用类型,因为如果不是引用的话,调用拷贝构造函数时要拷贝它的实参,拷贝它的实参需要调用拷贝构造函数构造函数,如此无限循环。
如果我们没有为类定义一个拷贝构造函数,编译器会自动合成一个拷贝构造函数。
(1)拷贝初始化
直接初始化是要求编译器使用普通的函数匹配选择与我们提供的实参最匹配的构造函数:
string s1(10,‘c‘);
string s2(s1);
拷贝初始化要求编译器将右侧运算对象拷贝到正在创建的对象中(有时候需要类型转换):
string s3=s1;
string s4="abc";
string s5=string(100,‘c‘);
拷贝初始化通常使用拷贝构造函数来完成。
如果在拷贝初始化的过程中需要类型转换,注意使用explicit的构造函数转换时只能用直接初始化:
vector<int>v1(10);//直接初始化
vector<int>v2=10;//错误,接受大小参数的构造函数时explicit的,不能类型转换后拷贝初始化
同理
void f(vector<int>);
f(10);//错误
f(vector<int>(10));正确,//直接构造一个临时的vector