首頁 >後端開發 >C++ >為什麼在 C 中分配給現有物件時不呼叫複製建構函式?

為什麼在 C 中分配給現有物件時不呼叫複製建構函式?

DDD
DDD原創
2024-12-08 09:22:11572瀏覽

Why Isn't the Copy Constructor Called When Assigning to an Existing Object in C  ?

為什麼在為現有物件分配新值時會繞過複製建構子

在提供的程式碼片段中,物件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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn