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 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 时没有任何反应。此时调用了什么构造函数或运算符?

谢谢。

最佳答案

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

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

另外,使用 C++11 move semantics through rvalue references 可能会取代 Copy 语义。即使使用移动语义,编译器仍然可以自由应用 RVO。

关于c++ - 关于 C++ 中的构造函数和赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17409745/

相关文章:

c++ - QtConcurrent::map 不接受参数

c++ - 相当于matlab的fliplr()的opencv是什么?

c++ - C++ 语言定义对 static 关键字的范围有什么看法?

c++ - 如何将用户输入存储在与默认构造函数中的变量初始化值不同的变量中?

c++ - 试图仅在 g++ 的宏中使 -Waggregate-return 保持沉默 - 错误的编译器?

c++ - C++在调用静态/全局对象的构造函数之前是否有效?

c++ - 为什么 g++ 不在这里执行结构打包?

c++ - 通过迭代器调用函数无法在派生对象上编译

c++ - 混合 constexpr 声明和 const 定义

c++ - 向 QGridLayout 添加太多的 Widget