必要性
与后文关系很大,需要完全弄清楚。我们要关心各种函数的的参数是什么,返回什么,为什么要这么设计。
赋值运算符函数
-
合成赋值运算符函数
在调用前:如果类显式地提供了赋值运算符,需要确认其一定是public成员。
A& A::operator=(const A &s) { }
这是一般格式,传入的是一个对象的引用,返回的则是一个另一个对象的引用。 -
重载赋值运算符函数
合成与重载的区别就是:合成是系统自带的,而重载是自己重写的。
拷贝构造函数
- 合成拷贝构造函数
X::X(const X&,...) { }
这个设计非常巧妙,我们不难联想到一般构造函数的形式,实际上,拷贝构造函数就是一种特殊的构造函数的重载,因此调用的形式也与构造函数无异。
移动函数
- 移动函数的本质:
移动函数的原理是:将原本的某个变量变成引用——这个步骤的实际意义就是将变量名与其拥有的资源分开。然后再将这个引用绑定到其他变量名上。 - move函数
根据之前阐述的原理,就不难理解int &&rrx = std::move(x);
的意思了。这是C++11中引入的move函数。 - 移动赋值与移动拷贝。
与赋值运算符函数、拷贝构造函数类似,如果移动函数没有被定义,系统将会自动合成。
我们也可以推理出移动赋值运算符函数与移动拷贝构造函数的基本形式:
A(A&& o){}//移动构造
A &operator=(A&& o){}//移动赋值
我们理解为,move函数为我们提供了一种很好的提取出对象的右值的方法,因此这两个函数才具有实用价值。