複製建構函式和複製指派運算子 (C++)
注意
從 C++11 開始,語言支援兩種指派:複製指派和移動指派。 在本文中,除非明確指定,否則「指派」表示複製指派。 如需移動指派的相關信息,請參閱移動建構函式和移動指派運算符 (C++)。
指派作業和初始化作業都會導致複製物件。
指派:將某個物件的值指派給另一個物件時,第一個物件會複製到第二個物件。 因此,此程式代碼會將 的值
b
a
複製到 :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
的值,則指派會成功。
如需多載指派運算符的詳細資訊,請參閱 指派。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應