1.拷贝构造第一个参数必须是引用类型,而且几乎总是一个const 引用,无返回值;拷贝赋值运算符的参数为其所在类 类型的const 引用,返回一个指向其左侧运算对象的引用
2.与默认构造函数不同,即使我们定义其他构造函数,若没有定义拷贝构造与拷贝赋值运算符,则编译器就会为我们合成
3.神奇功效:合成的拷贝构造会逐元素的拷贝一个数组类型的成员,合成的拷贝赋值运算符也能逐个赋值数组的每个成员
4.拷贝构造函数发生在一下以下几种情况:
a.当我们用=号定义变量时
b.将一个对象作为实参传递给一个非引用类型的形参
c.从一个返回类型为非引用类型的函数返回一个对象
d.用花括号列表初始化一个数组中的元素或一个聚合类的成员
5.几个例子,帮助理解
a.拷贝初始化与直接初始化: (ps:直接初始化实际上是要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数)
string dot(10, '.'); //直接初始化
string s(dot); //直接初始化 (ps: 虽然是直接初始化 但其实也是调用了拷贝构造函数)
string s2 = s; //拷贝初始化
string null_book = "99999999999" //拷贝初始化
string nine = string(100, '9'); //拷贝初始化
b.拷贝赋值运算符(相对简单一些)
Sales_data a, b;
a = b; //使用Sales_data的拷贝赋值运算符
摘自c++ primer