为什么我的本地物体被毁了两次

时间:2011-05-20 17:00:18

标签: c++ return-value

我有一个返回本地对象的函数:

class AT
{
public:
    AT() { cout<<"construct"<<endl; }

    AT(const AT& at) { cout<<"copy"<<endl; }

    ~AT() { cout<<"destroy"<<endl; }
};

AT funcAt()
{
    AT tmp;
    return tmp;
}
...
funcAt();

输出是:

construct
copy
destroy
destroy

我认为只有“tmp”的构造和破坏,为什么有副本和另一个破坏?复制对象在哪里?

5 个答案:

答案 0 :(得分:8)

让我们充实一点:

AT funcAt()
{
    AT tmp;           [1]
    return tmp;       [2]
}                     [3]
...
funcAt();             [4]

[1]在tmp中创建一个AT对象 [2]将tmp复制到返回值
[3]摧毁tmp
[4]因为没有使用而破坏返回值

答案 1 :(得分:1)

因为它是

1)在funcAt中创建:AT tmp 2)复制:return tmp;这是因为该函数返回一个副本:AT funcAt()
3)destroy - 第一个tmp对象和返回的副本

提示:注意输出中的copy:)

答案 2 :(得分:1)

原因是因为tmp的副本是从funcAt返回的,并且没有存储在任何地方,因此C ++会破坏它并调用析构函数

答案 3 :(得分:1)

构建并销毁

tmp。返回值(这是一个新对象,而不仅仅是一个引用)也是如此,尽管这里使用了cop构造函数。您没有看到正在使用的返回值,但它仍然通过。

答案 4 :(得分:0)

函数的返回值是函数内部使用的本地对象的单独对象(即副本)。