繁体   English   中英

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

[英]What is the proper way to return an object from a C++ function?

我感到很困惑:

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

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

谢谢

现代编译器通常实现(命名)返回值优化 ,通过该优化 ,您引用的(并且逻辑上期望的)副本不会完成。

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

那么来自<memory> std::auto_ptr怎么样? 或者如果C ++ 0x与std::unique_ptr

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

每份复印件 ,除非是

  1. 你返回一个类型的非本地对象 (如类成员,静态变量等),你将传递给每个const引用的函数 ; 你可以返回每个const引用
  2. 你返回一个非本地对象 ,调用者应该能够调用返回对象的修改成员 ,从而操纵存储在别处的对象; 每个非const引用返回此值
  3. 在多态类层次结构中返回派生类 ,该对象的用户应该只知道基类,并且#1和#2都不适用; 每个智能指针返回此信息

假设“没有库处理指针并自动释放内存”意味着没有按指针返回,没有boost::shared_ptr和没有std::unique_ptrstd::auto_ptr无论如何都是邪恶的),你有两个选择:

按价值返回:

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");

取决于对象的“语义”。 值应该由副本返回,而实体应该(或必须 ,因为它们理想地不可复制)由指针或引用返回。

应尽可能使用参考文献。 但是如果你必须返回一个指针,使用一个智能指针类,如std :: auto_ptr或boost :: shared_ptr是一个好主意,因为那时调用代码不必怀疑在完成它时释放它。

除非您需要子类型多态性,否则按值返回。 在后一种情况下,我将返回auto_ptr<T> (C ++ 03)或unique_ptr<T> (C ++ 0x)。

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

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

返回一个对象(但是该对象是从函数中的局部变量复制的,这会消耗内存)

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

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

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

返回一个引用(但这是不可能的,因为这将是对函数的局部变量的引用,一旦函数结束就会被删除)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM