构造函数
除了一般的构造函数之外,构造函数分为拷贝(复制)构造函数、赋值构造函数、移动构造函数、移动赋值构造函数、析构函数
构造函数分为两大类复制和移动构造函数,根据调用时机不同分为拷贝和赋值两种。
复制与移动的语义
复制和移动的区别是复制和移动类时的语义不一样
对于从B复制到A的复制语义是
- 释放A拥有资源
- A新建资源空间
- 从B复制资源到新建资源空间
- 如果B是右值则复制完成后释放B
对于从B移动到A的语义是
- 释放A拥有的资源
- 将B的资源控制权转给A
- 将B的资源控制权指针设置为空
拷贝构造函数的调用时机
1.通过另外一个对象构造对象的时候会调用拷贝构造函数
A a;
//调用拷贝构造
A b(a) or A b = a
2.函数调用对象值传递的时候会调用拷贝构造函数
3.函数返回对象的时候会调用拷贝构造函数
赋值构造函数的调用时机
1.赋值操作时调用
A a;
//调用赋值构造
a = b
移动构造函数的调用时机
A a;
A b = std::move(a);
A b = A();
void f(A&& a); //声明右值版本
f(A()); //调用移动构造
移动赋值函数的调用时机
A a;
A b;
b = std::move(a);
b = A();