[英]C++ object creation and constructor
我現在正在學習 ctors 並且有一些問題。 在這些行:
Foo obj(args);
Foo obj2;
obj2 = Foo(args);
Foo obj3 = Foo(args);
第一部分:只有 1 個稱為 (Foo) 和obj
構造函數被初始化。 因此,創建 1 個對象。
第二部分:創建臨時對象obj2
,為其調用默認構造函數。 接下來的幾行我們創建Foo
另一個副本並將其副本傳遞給operator=()
。 是對的嗎? 因此,3 個本地臨時對象,2 個構造函數調用。
第三部分:創建 1 個對象Foo
並將其副本傳遞給operator=()
。 因此,2 個臨時對象和 1 個 ctor 調用。
我理解正確嗎? 如果這是真的,編譯器(例如最后一個 gcc)會在常見情況下優化這些嗎?
我先評論第三個:
Foo obj3=Foo(args);
它不使用被稱為復制賦值的operator=
。 相反,它調用復制構造函數(理論上)。 這里沒有任務。 所以理論上,有兩個對象創建,一個是臨時的,另一個是obj3
。 編譯器可能會優化代碼,完全消除臨時對象的創建。
現在,第二個:
Foo obj2; //one object creation
obj = Foo(args); //a temporary object creation on the RHS
這里第一行創建一個對象,調用默認構造函數。 然后它調用operator=
傳遞從表達式Foo(args)
創建的臨時對象。 所以有兩個對象,只有operator=
通過const
引用獲取參數(這是它應該做的)。
關於第一個,你是對的。
是的, Foo obj(args)
創建一個 Foo 對象並調用一次ctor。
obj2
不被視為臨時對象。 但是就像 1 Foo obj2
創建一個對象並調用Foo
ctor。 假設你的意思是下一行obj2 = Foo(args)
,這一行會創建一個臨時 Foo 對象,然后調用obj2.operator=()
。 因此,對於第二個示例,只有一個臨時對象,一個非臨時對象,Foo ctors 被調用兩次(一次用於非臨時,一次用於臨時)並且 operator=() 被調用一次。
不,這一行不調用operator=()
。 當您使用=
語法初始化obj3
,它幾乎就像您使用括號一樣: Foo obj3(Foo(args));
所以這一行創建了一個臨時對象,然后調用 Foo 復制構造函數來使用該臨時對象初始化 obj3。
你的術語有點混亂。
對象obj
、 obj2
obj3
不被稱為“臨時對象”。 只有在分配給 obj 之前在第 3 行中創建的實例才是臨時對象。
此外,您不會創建“Foo 的副本”,而是創建“Foo 的實例”或“Foo 類型的對象”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.