0

我正在研究函数如何通过按值返回来返回对象。所以,为了测试这个理论,我运行了一个简单的程序,它有一个返回 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 语句期间创建的临时对象何时被销毁。

所以,我预计会调用 2 次析构函数;一个用于函数的对象本地副本,另一个用于临时对象。但相反,我只收到了一个!

请分享为什么我的程序没有两次输出“hello”。

谢谢。

4

1 回答 1

4

这是返回值优化的效果,它消除了为保存函数返回值而创建的临时对象。这优化了冗余的复制构造函数和析构函数调用。

于 2012-09-06T11:41:05.960 回答