共用方式為


複製建構函式和複製指派運算子 (C++)

注意

從 C++11 開始,語言支援兩種指派:複製指派和移動指派。 在本文中,除非明確指定,否則「指派」表示複製指派。 如需移動指派的相關信息,請參閱移動建構函式和移動指派運算符 (C++)。

指派作業和初始化作業都會導致複製物件。

  • 指派:將某個物件的值指派給另一個物件時,第一個物件會複製到第二個物件。 因此,此程式代碼會將 的值ba複製到 :

    Point a, b;
    ...
    a = b;
    
  • 初始化:當您宣告新的物件、依值傳遞函式自變數,或從函式傳回值時,就會發生初始化。

您可以定義類別類型物件的「複製」語意。 例如,請參考這個程式碼:

TextFile a, b;
a.Open( "FILE1.DAT" );
b.Open( "FILE2.DAT" );
b = a;

上述程式代碼可能表示「複製 FILE1 的內容。DAT 至 FILE2。DAT“ 或可能表示「忽略 FILE2」。DAT 並建立 b FILE1.DAT 的第二個句柄。」您必須將適當的複製語意附加至每個類別,如下所示:

  • 使用指派運算子 operator= ,傳回類別類型的參考,並採用一個以傳址方式 const 傳遞的參數,例如 ClassName& operator=(const ClassName& x);

  • 使用複製建構函式。

如果您未宣告複製建構函式,編譯程式會為您產生成員式複製建構函式。 同樣地,如果您未宣告複製指派運算符,編譯程式會為您產生成員式複製指派運算符。 宣告複製建構函式不會隱藏編譯程式產生的複製指派運算符,反之亦然。 如果您實作其中一個,建議您也實作另一個。 當您實作這兩者時,程式代碼的意義是清楚的。

複製建構函式會採用 類型的 ClassName&自變數,其中 ClassName 是類別的名稱。 例如:

// spec1_copying_class_objects.cpp
class Window
{
public:
    Window( const Window& );            // Declare copy constructor.
    Window& operator=(const Window& x); // Declare copy assignment.
    // ...
};

int main()
{
}

注意

盡可能建立複製建構函式自變數 const ClassName& 的類型。 這可防止複製建構函式不小心變更複製的物件。 它也可讓您從 const 物件複製。

編譯器產生的複製建構函式

編譯程式產生的複製建構函式,例如使用者定義的複製建構函式,具有「類別名稱參考」類型的單一自變數。例外狀況是,當所有基類和成員類別都宣告為採用類別名稱的單一自變數const時,複製建構函式。 在這種情況下,編譯程式產生的複製建構函式的 自變數也是 const

當複製建構函式的自變數類型不是 const時,藉由複製 const 對象進行初始化會產生錯誤。 反轉不是 true:如果 自變數為 const,您可以藉由複製不是 const的物件來初始化。

編譯程式產生的指派運算元遵循的 const相同模式。 除非所有基底和成員類別中的指派運算符採用 類型的const ClassName&自變數,否則它們會採用類型的ClassName&單一自變數。 在此情況下,類別產生的指派運算符會採用 const 自變數。

注意

當虛擬基類是由複製建構函式初始化時,無論是編譯程式產生的還是使用者定義,它們只會初始化一次:建構時。

含意類似於複製建構函式。 當自變數類型不是 const時,來自 const 物件的指派會產生錯誤。 反向不是 true:如果值 const 指派給不是 const的值,則指派會成功。

如需多載指派運算符的詳細資訊,請參閱 指派