我现在非常困惑,不知道该如何以及使用哪种方法从函数中返回对象。我希望能够针对给定要求的解决方案得到一些反馈。
情景A: 返回的对象将被存储在变量中,在其生命周期内无需修改。因此,
const Foo SomeClass::GetFoo() {
return Foo();
}
被调用为:
someMethod() {
const Foo& l_Foo = someClassPInstance->GetFoo();
//...
}
场景 B: 返回的对象将被存储在一个变量中,而这个变量在其生命周期内将被修改。因此,
void SomeClass::GetFoo(Foo& a_Foo_ref) {
a_Foo_ref = Foo();
}
被调用为:
someMethod() {
Foo l_Foo;
someClassPInstance->GetFoo(l_Foo);
//...
}
我有一个问题:假设Foo不能有默认构造函数,在这种情况下,你会如何处理,因为我们不能再写这样的代码了:
Foo l_Foo
场景C:
Foo SomeClass::GetFoo() {
return Foo();
}
调用方式:
someMethod() {
Foo l_Foo = someClassPInstance->GetFoo();
//...
}
我认为这不是推荐的方法,因为它会导致构造额外的临时对象。
你认为呢?另外,你有没有更好的处理方法?
a_Foo_ref = Foo();
创建对象并执行复制,几乎等同于最后一种情况。 - Anycornadd()
函数不会干扰它。但是,可能导致RVO不起作用的一件事是当函数创建多个对象并可能返回其中任何一个时,如此处所示:http://en.wikipedia.org/wiki/Return_value_optimization#Compiler_support - Josh Townzen