拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么。
拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么。
析构函数定义了当此类型对象销毁时做什么。
拷贝构造函数:
class Foo {
public:
Foo(); //默认构造函数
Foo(const Foo&); //拷贝构造函数
//...
};
拷贝构造函数的第一个参数必须是一个引用类型,且此参数几乎总是一个const的引用。拷贝构造可能被隐式地使用,因此拷贝构造函数不应该是explicit的。
合成的拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中。编译器从给定对象中依次将每个非static成员拷贝到正在创建的对象中。
拷贝初始化通常使用构造函数来完成。但是,如果一个类有一个移动构造函数,则拷贝初始化有时会使用移动构造函数而非拷贝构造函数来完成。
拷贝初始化发生的情况:
1.使用=定义变量时
2.将一个对象作为实参传递给一个非引用类型的形参
3.用花括号列表初始化一个数组中的元素或者一个聚合类中的成员
拷贝构造函数被用来初始化非引用类类型参数
在函数调用过程中,具有非引用类型的参数要进行拷贝和初始化。类似的,当一个函数具有非引用的返回类型时,返回之会被用来初始化调用方的结果。