c++ - 复制构造函数何时开始工作?

标签 c++

#include <iostream>
using namespace std;
class myclass {
public:
     myclass();
     myclass(const myclass &o);
     myclass f();
};
myclass:: myclass(){
    cout<<"Constructing normally"<<endl;
};
myclass:: myclass(const myclass &o){
    cout<<"Constructing copy"<<endl;
};
myclass myclass::f(){
    myclass temp;
    return temp;
};
int main(){
   myclass obj;
   obj = obj.f();
   return 0;
}

我在一本书中找到了这个例子,它表明程序的输出应该是:

Constructing normally
Constructing normally
Constructing copy 

但是当我在我的编译器中编译它时它只显示下面写的输出

Constructing normally
Constructing normally

里面到底发生了什么?

最佳答案

您的构造函数有一个副作用 - 即 cout 调用。所以编译器不能优化掉 obj = obj.f(); 中的拷贝。

但是 C++ 标准确实允许它优化掉接收到的深拷贝

myclass myclass::f(){
    myclass temp;
    return temp;
};

尽管有副作用。这种允许的策略称为命名返回值优化

遗憾的是,您的书确实已经过时,或者从一开始就与事实不符!在这个即将到来的冬天,您可以用它来点燃那些舒适的火苗。

关于c++ - 复制构造函数何时开始工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39661522/

相关文章:

c++ - 如何将 void(*)() 类型的指针转​​换为 void*

c++ - 使用 C++ 在本地磁盘上使用 GridFS

c++ - 页面分配处的 Visual Studio 断点

c++ - 我如何在此类中使用函数指针?

c++ - 正确的 Xcode 设置

c++ - 重载解析和显式模板参数

c++ - C++中的状态机通过单例?

java - 在赋值上复制构造函数

c++ - 将特征向量的绝对值存储到变量中

c++ - 使用内联函数在 C++ 中更安全地删除指针