共用方式為


複製類別物件

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

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

    Point a, b;
    ...
    a = b;
    

    會導致 b 的值複製到 a。

  • 初始化:初始化是在宣告新物件、引數以傳值方式傳遞至函式,或是以傳值方式從函式傳回值時發生。

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

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);。

  • 使用複製建構函式。 如需有關複製建構函式的詳細資訊,請參閱宣告建構函式的規則

如果您未宣告複製建構函式,編譯器就會自動產生成員複製建構函式。如果您未宣告複製指派運算子,編譯器就會自動產生成員複製指派運算子。 宣告複製建構函式不會隱藏編譯器產生的複製指派運算子,反之亦然。 如果您實作任一種,建議您一併實作另一種,如此程式碼的意義才會明確。

成員指派將在成員指派和初始化中詳細說明。

複製建構函式接受 class-name**&** 類型的引數,其中 class-name 是為其定義建構函式的類別名稱。 例如:

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

int main()
{
}
注意事項注意事項

盡可能讓複製建構函式引數的類型為 const class-name&。這樣可避免複製建構函式意外變更做為複製來源的物件。另外也可以從 const 物件複製。

請參閱

參考

特殊成員函式 (C++)