我有一个返回本地对象的函数:
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”的构造和破坏,为什么有副本和另一个破坏?复制对象在哪里?
答案 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)
函数的返回值是函数内部使用的本地对象的单独对象(即副本)。