簡體   English   中英

C++ 對象創建和構造函數

[英]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引用獲取參數(這是它應該做的)。

關於第一個,你是對的。

  1. 是的, Foo obj(args)創建一個 Foo 對象並調用一次ctor。

  2. obj2不被視為臨時對象。 但是就像 1 Foo obj2創建一個對象並調用Foo ctor。 假設你的意思是下一行obj2 = Foo(args) ,這一行會創建一個臨時 Foo 對象,然后調用obj2.operator=() 因此,對於第二個示例,只有一個臨時對象,一個非臨時對象,Foo ctors 被調用兩次(一次用於非臨時,一次用於臨時)並且 operator=() 被調用一次。

  3. 不,這一行不調用operator=() 當您使用=語法初始化obj3 ,它幾乎就像您使用括號一樣: Foo obj3(Foo(args)); 所以這一行創建了一個臨時對象,然后調用 Foo 復制構造函數來使用該臨時對象初始化 obj3。

你的術語有點混亂。

對象objobj2 obj3不被稱為“臨時對象”。 只有在分配給 obj 之前在第 3 行中創建的實例才是臨時對象。

此外,您不會創建“Foo 的副本”,而是創建“Foo 的實例”或“Foo 類型的對象”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM