gpt4 book ai didi

c++ - 从函数返回对象

转载 作者:IT老高 更新时间:2023-10-28 21:57:20 25 4
gpt4 key购买 nike

我现在真的很困惑如何以及使用哪种方法从函数返回对象。我想要一些关于给定要求的解决方案的反馈。

场景 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) 用于初始化引用时延长临时对象的生命周期 - 我在 this publication 中了解了它安德烈·阿内桑德雷斯库。同样,它感觉很奇怪但很有用:

class Foo { ... }

Foo GetFoo() { return Foo(); } // returning temporary

void UseGetFoo()
{
Foo const & foo = GetFoo();
// ... rock'n'roll ...
foo.StillHere();
}

规则说,当使用临时对象初始化引用时,临时对象的生命周期会延长,直到引用超出范围。 (this reply 引用经典)

(b) 返回值优化 - ( wikipedia ) - 两份本地 --> 返回值 --> 本地可以在某些情况下省略。这是一个令人惊讶的规则,因为它允许编译器更改可观察的行为,但很有用。

你有它。 C++ - 奇怪但有用。


所以看看你的场景

场景 A:您正在返回一个临时对象,并将其绑定(bind)到一个引用 - 临时对象的生命周期延长到 l_Foo 的生命周期。

请注意,如果 GetFoo 将返回一个引用而不是一个临时的,这将不起作用。

场景 B: 可行,只是它强制进行 Construct-Construct-Copy-Cycle(这可能比单个构造更昂贵),而您遇到的问题提到需要默认构造函数。

我不会使用该模式来创建对象 - 只会改变现有的对象。

场景 C: 编译器可以省略临时文件的拷贝(根据 RVO 规则)。不幸的是,无法保证 - 但现代编译器确实实现了 RVO。

Rvalue references在 C++ 0x 中,允许 Foo 实现一个资源窃取构造函数,它不仅保证了拷贝的抑制,而且在其他场景中也很方便。

(我怀疑是否有一个编译器实现了右值引用而不是 RVO。但是有些情况下 RVO 无法启动。)


这样的问题需要提及智能指针,例如 shared_ptrunique_ptr(后者是“安全的”auto_ptr)。他们也在C++ 0x .它们为创建对象的函数提供了另一种模式。


关于c++ - 从函数返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2616107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com