0、拷贝初始化发生的情况:使用=初始化,非引用传参,返回一个对象,列表初始化数组或聚合类
1、编译器可以绕过拷贝构造函数,但拷贝构造函数必须是存在且可访问的(GCC是这样,但VS可以是private的)
2、赋值运算符通常应该返回一个指向其左侧运算对象的引用,这样可以与内置类型的赋值保持一致
3、一般需要析构函数来释放资源的类,通常也需要自己定义拷贝和赋值操作来分配资源
4、可以通过将拷贝控制成员定义为=default来显示地要求编译器生成合成的版本
5、可以将拷贝构造函数和拷贝赋值运算符定义为=delete来阻止拷贝
6、对于删除了析构函数的类型,虽不能定义该类的变量,但可以动态分配这种类型的对象,但是不能释放
7、当不能拷贝、赋值或销毁类的成员时,类的合成拷贝控制成员就被定义为删除的
8、c+11之前,类通过将其拷贝构造函数和拷贝赋值运算符声明为private,但友元和成员函数仍可以拷贝对象,为了阻止拷贝,可以只声明拷贝控制成员,但不定义它们
9、编写赋值运算符的最好办法是在销毁左侧运算对象资源之前拷贝右侧运算对象