我正在研究函数如何通过返回值返回对象。所以,为了测试这个理论,我运行了一个简单的程序,它有一个返回myclass实例的函数 - 一个定制的类。
#include <iostream>
#include <cstdio>
using namespace std;
class myclass {
int i;
public:
void set_i(int n) { i=n; }
~myclass();
};
myclass f(int k); // return object of type myclass
int main()
{
f(20);
return 0;
}
myclass f(int k)
{
myclass x;
x.set_i(k);
return x;
}
myclass::~myclass() {
cout << "hello\n";
}
我通过在其中放置一个cout“hello”语句来重载析构函数,以便我能够跟踪函数中对象的本地副本以及在执行return语句期间创建的临时对象何时被销毁。 / p>
所以,我预计会有2次调用析构函数;一个用于函数的对象本地副本,另一个用于临时对象。但相反,我只收到了一个!
请分享为什么我的程序没有两次输出“你好”。
感谢。
答案 0 :(得分:4)
这是返回值优化的效果,它消除了为保存函数的返回值而创建的临时对象。这样可以优化冗余的复制构造函数和析构函数调用。