簡體   English   中英

關於C ++中的構造函數和賦值運算符

[英]About constructors and assign operators in C++

我只是創建了一個這樣的類:

class GreatClass
{
public:
    GreatClass(){cout<<"Default Constructor Called!\n";}
    GreatClass(GreatClass &gc){cout<<"Copy Constructor Called!\n";}
    GreatClass(const GreatClass &gc){cout<<"Copy Constructor (CONST) Called!\n";}
    ~GreatClass(){cout<<"Destructor Called.\n";}
    GreatClass& operator=(GreatClass& gc){cout<<"Assign Operator Called!";return gc;}
    const GreatClass& operator=(const GreatClass& gc){cout<<"Assign Operator (CONST) Called!";return gc;}
};

GreatClass f(GreatClass gc)
{
    return gc;
}

在main()函數中,有兩個版本:

版本#1:

int main()
{
    GreatClass g1;
    GreatClass G = f(g1);
}

版本#2:

int main()
{
    GreatClass g1;
    f(g1);
}

它們都生成SAME輸出:

Default Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Destructor Called.
Destructor Called.
Destructor Called.

我不明白為什么當我將f(g1)分配給G時沒有發生任何事情。 此時調用什么構造函數或運算符?

謝謝。

在某些情況下,允許編譯器實現刪除/刪除復制構造函數調用,您指定的示例是這種情況的一個很好的示例用例。 不是創建臨時對象然后將其復制到目標對象,而是直接在目標對象中創建對象,並刪除復制構造函數調用。

此優化稱為復制省略通過返回值優化

此外,使用C ++ 11 移動語義通過右值引用可能會啟動而不是復制語義。 即使使用移動語義,編譯器仍然可以自由地應用RVO。

暫無
暫無

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

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