6
我只是創造了這樣一個類:關於構造函數和指定運營商在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);
}
他們所有產生相同的輸出:
Default Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Destructor Called.
Destructor Called.
Destructor Called.
我不明白,爲什麼沒有什麼,當我分配到f(g1)
發生G
。此時調用的構造函數或操作符是什麼?
謝謝。
複製elision是怎麼回事。如果您使用的是GCC,請嘗試使用'-fno-elide-constructors'編譯標誌。 –
我想可能是你的困惑的一部分原因是'operator ='沒有被使用。這是由標準決定的。形式爲'A a2 = a1;'的東西是複製初始化,並且使用了複製構造函數(而不是賦值運算符)。複製elision也可以發揮作用。 – huskerchad