先普及一下基本知識:
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;
}