我有这个功能:const A& f(...){...}
a. const A a1 = f(..);
b. const A &a2 = f(...);
哪个更好用?在这两种情况下,如果我理解正确,我会阻止修改返回对象的可能性。 在第一个选项中,A的复制构造函数将被调用 - 我是否正确?
答案 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();