C++ 关于C+中的构造函数和赋值运算符+;

C++ 关于C+中的构造函数和赋值运算符+;,c++,C++,我只是创建了这样一个类: class GreatClass { public: GreatClass(){cout<<"Default Constructor Called!\n";} GreatClass(GreatClass &gc){cout<<"Copy Constructor Called!\n";} GreatClass(const GreatClass &gc){cout<<"Copy Constructo

我只是创建了这样一个类:

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;
}
第2版:

它们都生成相同的输出:

Default Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Destructor Called.
Destructor Called.
Destructor Called.
我不明白为什么在我将
f(g1)
分配给
G
时什么也没有发生。此时调用什么构造函数或运算符


谢谢。

在某些情况下,允许编译器实现省略/删除复制构造函数调用,您指定的示例就是此类场景的一个很好的示例用例。不是创建临时对象然后将其复制到目标对象,而是直接在目标对象中创建对象,并删除复制构造函数调用

这种优化称为通过复制省略


此外,使用C++11可能会取代复制语义。即使使用移动语义,编译器仍然可以自由地应用RVO。

正在进行的是复制省略。如果您使用的是GCC,请尝试使用
-fno-elide构造函数编译标志。我认为您的部分困惑是为什么不使用
操作符=
。这是由标准规定的。形式为a2=a1的事物是复制初始化,使用复制构造函数(而不是赋值运算符)。复制省略也可以发挥作用。
int main()
{
    GreatClass g1;
    f(g1);
}
Default Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Destructor Called.
Destructor Called.
Destructor Called.