拷贝:在使用一个已有的对象初始化一个新的对象,在初始化,参数传递,返回与列表初始化时会被使用,当且仅当右值的类型与左值相同时或者可以隐式转换时。

赋值:在使用一个已有的对象赋值一个已有的对象。

这两种操作分开的原因可能是因为拷贝会申请内存?

当拷贝控制操作没有定义时,编译器会自动合成。

拷贝构造函数

当一个构造函数的形参时自身类类型的引用时,且额外参数有默认值,则是拷贝构造函数。

由于常常被隐式调用并且(会进行隐式类型转换),因此通常不应是explicit的。

与默认构造函数不同,即便声明了其他的构造函数,也会进行合成。

合成拷贝构造函数会将所有非static成员拷贝,拷贝时要么调用类的拷贝构造函数或直接拷贝,对于数组会逐一拷贝。

若是其不是引用类型,那么传入的过程也需要拷贝初始化,就套娃了,因此必须是引用。

拷贝初始化对右值要求隐式转换,而直接初始化是显式转换。

在编译过程中,编译器可能换将拷贝初始化改为直接初始化,但即便如此,拷贝/移动构造函数也必须存在且可访问。

拷贝赋值运算符

与拷贝构造函数不同,拷贝赋值运算符是对运算符=的重载,一般返回一个左值引用。

但默认拷贝赋值运算符的内部与默认拷贝构造函数差不多。

折构函数

销毁对象的非static成员。

折构函数包含两部分,函数体与折构部分(销毁元素的部分),其顺序与构造函数完全相反,先执行函数体,再按照声明顺序逆序销毁对象。但折构部分是隐式的。其成员到底如何折构,取决于其类型。如内置类型没有折构函数,因此无需折构。

当一个引用或指针被销毁时,其对象不会被折构。但是智能指针不同。

合成的折构函数的函数体实际上就是空的。