String 指派函式比建構函式複雜,分四步完成:
if (this == &other) return *this;b=a; c=b; a=c; 或 b=&a; a=*b;)。若忽略檢查,步驟二的 delete 會導致物件「自殺」後無法複製。delete[] m_data;,延遲釋放會造成記憶體洩漏。strlen 不含結束符,strcpy 會複製結束符。*this:支援 a = b = c 鏈式指派。切勿寫成 return this(型別錯誤)或 return other(other 可能為暫時物件,回傳後成懸空參考)。若不想撰寫複製建構/指派函式,又不允許使用編譯器預設版本,最簡單做法是將它們宣告為 private 且不提供定義:
class A {
private:
A(const A& a); // 私有複製建構函式
A& operator=(const A& a); // 私有指派函式
};
任何嘗試複製或指派 A 物件的程式碼(如 A b(a); b = a;)都會導致編譯錯誤,因外部無法存取私有函式。這是「不可複製類別」的經典手法(C++11 後可用 = delete 更明確)。
基底類別的建構、解構、指派函式不會被繼承。派生類別撰寫時須注意: