1
#include <iostream>
using namespace std;

class ClassA {
    int k;
public:
    ClassA(int i) : k(i) 
    {
    }

    ~ClassA()
    {
        cout << "A destroyed" << " k=" << k << endl;
    }

    ClassA copyAndModify() 
    { 
        ClassA a(k*2);
        return a; 
    }

    void taunt() 
    {
        cout << k << endl;
    }
};

int main (int argc, char * const argv[]) {
    ClassA original(1)
    ClassA modified = original.copyAndModify();
    modified.taunt();
    return 0;
}

我认为当方法返回时对象'a'(内部方法copyAndModify)被解构,但事实并非如此。这是否意味着在方法中创建的所有正在返回的对象都不会被解构?这对所有编译器都是如此吗?

4

4 回答 4

7

您遇到了返回值优化。不,它不会在所有编译器上都相同。

于 2012-04-20T23:05:16.713 回答
1

这取决于编译器,但通常当方法按值返回对象实例时,编译器可以使用 RVO(返回值优化)通过将目标对象作为隐藏引用参数传递来防止创建临时对象。换句话说,编译器会调整生成的代码,就像您编写的代码一样,如下所示:

void copyAndModify(ClassA &result)
{  
    ClassA a(k*2); 
    result = a;  
} 

ClassA modified;
original.copyAndModify(modified); 
于 2012-04-20T23:09:12.970 回答
0

在 VS 的情况下,如果您在调试模式下构建,则不会进行任何优化(对象将被销毁),但在发布模式下会启动优化(对象不会被销毁)。

于 2012-04-20T23:12:42.613 回答
-1

这是正确的。如果它被返回,它不会被破坏。那讲得通。返回一个已经被销毁的对象是没有意义的。

于 2012-04-20T23:05:58.337 回答