我感到困惑:
我正在寻找从C ++函数返回对象的正确方法,在基本的C ++中(没有库处理指针和自动释放内存)。我想知道应该怎么做。
谢谢
答案 0 :(得分:8)
现代编译器通常实现(Named) Return Value Optimization,通过该{{3}},您引用的副本(并且逻辑上期望的)不会被完成。
自Visual Studio 2005(VC ++ 8.0)以来,我没有考虑过返回对象。
答案 1 :(得分:3)
来自std::auto_ptr
的{{1}}怎么样?或者如果涉及C ++ 0x <memory>
?
答案 2 :(得分:3)
关于从函数返回对象的一些经验法则:
返回 每份 ,除非
const
reference;您可以返回 每const
个参考 const
参考 答案 3 :(得分:2)
假设“没有库处理指针并自动释放内存”意味着没有按指针返回,没有boost::shared_ptr
而没有std::unique_ptr
(std::auto_ptr
无论如何都是evil),你有两个选择:
按价值返回:
Foo bar(quux)
{
Foo foo;
foo.frobnicate(quux);
return foo;
}
Foo foo = bar("fred");
通过引用传递:
void bar(Foo& foo, quux)
{
foo.frobnicate(quux);
}
Foo foo;
bar(foo, "fred");
答案 4 :(得分:1)
取决于对象的“语义”。应该通过复制返回值,而实体应该(或必须,因为它们理想地不可复制)由指针或引用返回。
应尽可能使用参考文献。但是如果你必须返回一个指针,使用一个智能指针类,如std :: auto_ptr或boost :: shared_ptr是一个好主意,因为那时调用代码不必怀疑在完成它时释放它。
答案 5 :(得分:0)
除非您需要子类型多态,否则按值返回。在后一种情况下,我会返回auto_ptr<T>
(C ++ 03)或unique_ptr<T>
(C ++ 0x)。
答案 6 :(得分:0)
我个人更喜欢第二个选项,因为很明显用户需要分配和删除内存。
答案 7 :(得分:0)
返回一个对象(但是然后是 对象是从本地复制的 函数中的变量,即 消耗记忆)
优化编译器可能不会花费大量时间来创建副本。 您可能还需要实现复制构造函数和重载赋值运算符,具体取决于您的对象内容。
返回指针(但是你有 记住删除它,在 调用代码,这很奇怪)
是的,你必须记得删除它,因为你不想考虑自动清理这个问题。
返回引用(但事实并非如此) 可能因为这将是一个 引用的局部变量 功能,将删除为 一旦功能结束)
当您从成员函数返回此对象(* this)时,返回引用很有用。否则,就像你提到它不可能使用。
总体而言:这取决于您上面所述的关于选择何时选择的需求。