【发布时间】:2012-12-21 07:45:42
【问题描述】:
C++ 引用仍然让我感到困惑。假设我有一个函数/方法,它创建一个 Foo 类型的对象并通过引用返回它。 (我假设如果我想返回对象,它不能是分配在堆栈上的局部变量,所以我必须用new在堆上分配它):
Foo& makeFoo() {
...
Foo* f = new Foo;
...
return *f;
}
当我想将创建的对象存储在另一个函数的局部变量中时,类型应该是Foo
void useFoo() {
Foo f = makeFoo();
f.doSomething();
}
或Foo&?
void useFoo() {
Foo& f = makeFoo();
f.doSomething();
}
由于两者都是正确的语法:这两个变体之间是否存在显着差异?
【问题讨论】:
-
(I assume that if I want to return the object, it cannot be a local variable allocated on the stack, so I must allocate it on the heap with new)这是一个问题,并且使情况变得更糟。简单地不要通过引用返回变量:通过值返回它并让优化器(或 C++11 移动语义)完成他们的工作。 -
其实
Foo& f = makeFoo();的版本可能编译不了。 -
@LightnessRacesinOrbit 为什么不呢?
-
@LuchianGrigore:参考临时?
-
@cls:任何正确解释移动语义学的资源都应该让您了解它的相关性(试试维基百科:“移动语义学”)。重点是减少不必要的复制成本。只需确保您的 Foo 对象旨在利用它。主要是要保证对象的“大”不在对象本身,而是在外部引用。一个典型的例子是
std::vector,它在内部只是几个指针。但是这些指针可以引用大量数据。可以通过简单地复制和取消指针来移动向量。
标签: c++ reference return return-type