拷贝:在使用一个已有的对象初始化一个新的对象,在初始化,参数传递,返回与列表初始化时会被使用,当且仅当右值的类型与左值相同时或者可以隐式转换时。
赋值:在使用一个已有的对象赋值一个已有的对象。
这两种操作分开的原因可能是因为拷贝会申请内存?
当拷贝控制操作没有定义时,编译器会自动合成。
当一个构造函数的形参时自身类类型的引用时,且额外参数有默认值,则是拷贝构造函数。
由于常常被隐式调用并且(会进行隐式类型转换),因此通常不应是explicit的。
与默认构造函数不同,即便声明了其他的构造函数,也会进行合成。
合成拷贝构造函数会将所有非static成员拷贝,拷贝时要么调用类的拷贝构造函数或直接拷贝,对于数组会逐一拷贝。
若是其不是引用类型,那么传入的过程也需要拷贝初始化,就套娃了,因此必须是引用。
拷贝初始化对右值要求隐式转换,而直接初始化是显式转换。
在编译过程中,编译器可能换将拷贝初始化改为直接初始化,但即便如此,拷贝/移动构造函数也必须存在且可访问。
与拷贝构造函数不同,拷贝赋值运算符是对运算符=的重载,一般返回一个左值引用。
但默认拷贝赋值运算符的内部与默认拷贝构造函数差不多。
销毁对象的非static成员。
折构函数包含两部分,函数体与折构部分(销毁元素的部分),其顺序与构造函数完全相反,先执行函数体,再按照声明顺序逆序销毁对象。但折构部分是隐式的。其成员到底如何折构,取决于其类型。如内置类型没有折构函数,因此无需折构。
当一个引用或指针被销毁时,其对象不会被折构。但是智能指针不同。
合成的折构函数的函数体实际上就是空的。