通过引用返回 - 两者中哪一个是正确的

时间:2010-03-24 11:56:33

标签: c++

我有这个功能:const A& f(...){...}

a. const A a1 = f(..);
b. const A &a2 = f(...);

哪个更好用?在这两种情况下,如果我理解正确,我会阻止修改返回对象的可能性。 在第一个选项中,A的复制构造函数将被调用 - 我是否正确?

4 个答案:

答案 0 :(得分:15)

这取决于你想要什么。

在第一种情况下,您将创建一个由返回的引用构造的新const对象。它将是返回内容的快照,并且在整个生命周期内都有效。

在第二步中,您只需初始化参考。这意味着通过引用可以看到对原始对象的任何更改,但是当引用仍然存在时,存在被销毁对象的危险。

答案 1 :(得分:1)

是的,我更喜欢第二种选择,因为它可以防止创建副本。

答案 2 :(得分:0)

你是正确的上述副本。较低的不是。

第二个是首选的。

答案 3 :(得分:-1)

<强>(更新)

如果函数是类的方法并且您正在返回对该类的某个成员的引用,则应该通过引用返回。如果要在函数中创建对象,然后返回对它的引用,则返回对不再存在的对象的引用 - 当堆栈展开时,在该函数中创建的对象将被销毁。

你也可以这样做:

A someA;
f(someA); // Assuming that f's signature is void f(A&)

或者这样:

auto_ptr<A> someA = f();