从C ++函数返回对象的正确方法是什么?

时间:2010-10-17 14:37:03

标签: c++ pointers object reference

我感到困惑:

  • 返回对象(但是该对象是从函数中的局部变量复制的,这会消耗内存)
  • 返回指针(但是你必须记住在调用代码中删除它,这很奇怪)
  • 返回引用(但这是不可能的,因为这将是对函数的局部变量的引用,一旦函数结束就会被删除)

我正在寻找从C ++函数返回对象的正确方法,在基本的C ++中(没有库处理指针和自动释放内存)。我想知道应该怎么做。

谢谢

8 个答案:

答案 0 :(得分:8)

现代编译器通常实现(Named) Return Value Optimization,通过该{{3}},您引用的副本(并且逻辑上期望的)不会被完成。

自Visual Studio 2005(VC ++ 8.0)以来,我没有考虑过返回对象。

答案 1 :(得分:3)

来自std::auto_ptr的{​​{1}}怎么样?或者如果涉及C ++ 0x <memory>

答案 2 :(得分:3)

关于从函数返回对象的一些经验法则:

返回 每份 ,除非

  1. 您返回 非本地对象 (如类成员,静态变量等),类型为pass to a function per const reference;您可以返回 const个参考
  2. 您返回 非本地对象 ,并且调用者应该能够 调用返回的修改成员 对象,从而操纵存储在别处的对象;每个非const参考
  3. 返回此
  4. 您在多态类层次结构中返回 派生类 ,该对象的用户应该只知道基类,并且#1和#2都不适用;每个智能指针返回

答案 3 :(得分:2)

假设“没有库处理指针并自动释放内存”意味着没有按指针返回,没有boost::shared_ptr而没有std::unique_ptrstd::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)

  • 返回一个智能指针选择(要么必须依赖额外的库,要么等到C ++ 1x)
  • 使用传递参考

我个人更喜欢第二个选项,因为很明显用户需要分配和删除内存。

答案 7 :(得分:0)

  

返回一个对象(但是然后是   对象是从本地复制的   函数中的变量,即   消耗记忆)

优化编译器可能不会花费大量时间来创建副本。 您可能还需要实现复制构造函数和重载赋值运算符,具体取决于您的对象内容。

  

返回指针(但是你有   记住删除它,在   调用代码,这很奇怪)

是的,你必须记得删除它,因为你不想考虑自动清理这个问题。

  

返回引用(但事实并非如此)   可能因为这将是一个   引用的局部变量   功能,将删除为   一旦功能结束)

当您从成员函数返回此对象(* this)时,返回引用很有用。否则,就像你提到它不可能使用。

总体而言:这取决于您上面所述的关于选择何时选择的需求。