為什麼在為現有物件分配新值時會繞過複製建構子
在提供的程式碼片段中,物件a 被初始化為值5。標準 A 構造函數按預期呼叫。然而,與假設相反的是,在對新建構的物件進行賦值時,並沒有呼叫複製建構函式。
這種行為既不是編譯器最佳化的結果,也不是語言規格中的遺漏。它在 C 標準中明確記錄(§12.8.15,第 211 頁)。該標準規定以下賦值在語義上是等價的「完全可以接受」:
T = x; T(x);
從邏輯上講,可以從程式碼最佳化中刪除像T(T(x)) 這樣的冗餘賦值。因此,編譯器會自動呼叫預設建構函式來初始化 a,然後直接對新建構的物件進行賦值。
要強制呼叫複製建構函數,需要在賦值之前明確預設建構 a:
A a; // Default-construct 'a' // Copy constructor will be called to // copy data from the newly constructed object. a = A(5);
以上是為什麼在 C 中分配給現有物件時不呼叫複製建構函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!