1. 程式人生 > >用例項程式碼理解一下c++11”定義解構函式阻止合成移動”

用例項程式碼理解一下c++11”定義解構函式阻止合成移動”

先普及一下基本知識:

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;
}