先普及一下基本知识:
1、移动:int &&a = b; 将b移动给a,会避免一些对象复制,移动之后,b就没有用了。
2、析构:对象释放时,执行的清理函数。
原理很好理解:如果定义了析构函数,则说明清理工作有一些个性化,成员数据如果执行了移动 ,会产生扫尾时,数据已经无效了或继续有效,但操作会影响其他对象。这个时间,会执行拷贝代替移动 。
通过以下代码的差异化,可以感受一下:
1、F2有一个F类型的成员,通过显示定义拷贝和移动,打出日志来查看过程。
2、调用test时,传递参数,执行了一次拷贝,输出new
3、返回值赋值给f3时,执行移动,定义~F2则无法执行移动,执行了拷贝。
class F
{
public:
F() = default;
F(const F& f) { cout << "new" << endl; } //显示定义拷贝构造
F(const F&& f) { cout << "move" << endl; } //显示定义移动构造
F& operator=(const F& f) { cout << "eq" << endl; }
};
class F2
{
public:
F m_f1;
~F2() { } //加这行,输出2个new,不加输出new和move
};
F2 test(F2 f) { return f; }
int main()
{
F2 f1;
F2 &&f3 = test(f1);
return 0;
}