关于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时没有发生任何事情.此时调用了什么构造函数或运算符?

谢谢.

解决方法

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

此优化称为通过Return value optimization复制省略.

此外,使用C 11 move semantics through rvalue references可能会启动而不是复制语义.即使使用移动语义,编译器仍然可以自由地应用RVO.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...