三種情況需以物件內容初始化另一同類別物件:
ClassA b = a;void AddNew(CUser user); db.AddNew(user);CUser GetUser(int id);類別未宣告複製建構函式時,編譯器隱含宣告並視需要合成。分為 trivial (位元級複製) 與 nontrivial (需逐項複製)。
class Word {
public:
Word(const char* s) : str(new char[strlen(s)+1]) { strcpy(str, s); }
~Word() { delete[] str; }
private:
int cnt;
char* str;
};
Word noun("lsmodel");
void foo() { Word verb = noun; } // 離開 foo() 時 verb 解構刪除 str,noun 成懸空指標
解決方案:實作深層複製的複製建構函式,或改用 String 類別 (具正確複製語意),讓編譯器合成正確呼叫 String 複製建構函式的版本。
vptr 指向正確 vtable,而非複製來源的 vptr)。當物件以另一物件為初值時,若類別涉及資源管理 (指標)、多態 (虛擬函式) 或虛擬繼承,位元級複製會導致嚴重錯誤。編譯器自動合成正確的複製建構函式處理 vptr 重設、虛擬基類指標調整與成員級初始化,確保物件語意正確性。