用例項程式碼理解一下c++11”定義解構函式阻止合成移動”
阿新 • • 發佈:2019-02-13
先普及一下基本知識:
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;
}