2013-05-13 31 views
0

我有一個數組類,我抓住一個網站,給出了一個移動構造函數的例子。然而,如何在示例程序中實現這個移動構造函數呢?我覺得我理解函數定義,但我不知道如何在程序中使用它。實現一個數組類的移動構造函數(右值引用)

class ArrayWrapper 
{ 
public: 
    // default constructor produces a moderately sized array 
    ArrayWrapper() 
     : _p_vals(new int[ 64 ]) 
     , _size(64) 
    {} 

    ArrayWrapper (int n) 
     : _p_vals(new int[ n ]) 
     , _size(n) 
    {} 

    // move constructor, how does this come in handy? 
    ArrayWrapper (ArrayWrapper&& other) 
     : _p_vals(other._p_vals ) 
     , _size(other._size) 
    { 
     other._p_vals = NULL; 
    } 

    // copy constructor 
    ArrayWrapper (const ArrayWrapper& other) 
     : _p_vals(new int[ other._size ]) 
     , _size(other._size) 
    { 
     for (int i = 0; i < _size; ++i) 
     { 
      _p_vals[ i ] = other._p_vals[ i ]; 
     } 
    } 
    ~ArrayWrapper() 
    { 
     delete [] _p_vals; 
    } 

private: 
    int *_p_vals; 
    int _size; 
}; 
+1

[什麼是移動語義](http://stackoverflow.com/questions/3106110/what-are-move-semantics) – 0x499602D2 2013-05-13 23:48:45

回答

2

如何將一個實現然而一個示例程序這一舉動構造?

我想你的代碼已經顯示出來了。

我覺得我理解函數的定義,但我不知道如何在程序中使用它。

只需使用幾種方法之一來觸發移動。例如:

ArrayWrapper aw; 
ArrayWrapper aw2 = std::move(aw); 

甚至:

ArrayWrapper foo() 
{ 
    ArrayWrapper aw; 
    //... 
    return aw; 
} 

// ... 

ArrayWrapper aw2 = foo(); 

注意,在後一種情況下,編譯器可能是反正在的Elid調用移動的構造。

+0

那麼這是否使得aw2成爲aw的深層副本?通過使用移動構造函數? – 2013-05-13 23:49:38

+0

@ Need4Sleep:不,移動構造函數用於將移動對象的內容移動到正在構建的對象中。這與深拷貝 – 2013-05-13 23:50:27

+0

@ Need4Sleep相反,它是一個淺拷貝。在這之後你不能使用'aw'。對即將銷燬的臨時設備是有益的。它只複製一個指針,而不是整個數組。 – chris 2013-05-13 23:50:30

1

它用於複製構造函數將會相同的情況,但僅當從其複製的表達式是右值時。一個右值通常是指一個臨時對象。因此,例如,如果您有一個函數foo按值返回ArrayWrapper,那麼調用該函數的表達式將是一個右值。

ArrayWrapper aw = foo(); 

這裏,ArrayWrapper對象將從由foo返回的臨時對象來構造。選擇移動構造函數重載是因爲右值引用參數綁定到右值表達式。

移動構造函數通常會將其正在移動的對象置於有效但不確定的狀態。

相關問題