一般来说,STL容器的getter返回类型应该是什么?

时间:2012-09-30 23:28:01

标签: c++ getter-setter

  

可能重复:
  Should accessors return values or constant references?

首先,让我们忽略制定者和吸气者不是邪恶的。 :)

我的问题是,如果我的某个容器有一个std::容器作为成员,那么让我们说string,getter的返回类型应该是什么?出于性能原因,我更倾向于const T&T相比...我知道大多数时候用户都会制作副本,但我想并不是所有的时间。我错了吗?

总的来说,更好的是:

std::string get_name() const;

OR

const std::string& get_name() const;

4 个答案:

答案 0 :(得分:7)

返回一个常量引用。如果用户想要制作副本,则不会背上皮肤。

答案 1 :(得分:2)

以下是考虑因素:

1)返回副本string。然后文档很简单(“返回...的当前值”)并且函数很慢(我怀疑在很多情况下编译器足够智能以省略副本,即使返回值仅在a中使用从理论上讲,编译器可以将string识别为具有无副作用副本的值类型,并且还可以证明在调用者使用副本的期间内referand无法更改,因此改为使用引用。但是它会完成所有这些吗?)。

2)返回引用const string&。然后文档很复杂,(“返回对包含当前值的string对象的引用...此引用在以下时间内保持有效...它继续包含以下子集的相同值那时...”)。如果呼叫者不需要副本,则该功能很快。该类的实现几乎受限于将来将该字符串存储为string数据成员,因为它不会以适当的生命周期返回任何内容。

别名可能很快(如果它避免了副本)但很复杂(因为重做可以改变或消失),因此返回引用的函数可能很快但很复杂。此外,(1)是“返回对象的属性的getter”,但是(2)是“返回对象的私有成员的getter”。因此,如果吸气者是邪恶的,那么(2)更多邪恶而不是(1)。

我通常会返回引用,如果getter基本上是作为其他紧密耦合的类来获取数据的hack,或者如果类具有非常明显的语义,它何时会改变,例如“永远不会在对象的生命周期内”,或者如果字符串预计会如此巨大以至于通过引用将其公开是合理的,因为将它的副本应该是罕见的,所以调用者将期待视图行为而不是值行为。我可能会返回值,如果接口应该是永久兼容的,只是为了安全,除非我正在编写的类被明确设计为“一个包含大字符串的东西并为你做X同时仍然让我你看到字符串“。

不可变的垃圾收集字符串会使这个问题消失,这可能是他们对高级语言设计师有吸引力的原因之一。

答案 2 :(得分:1)

这取决于吸气剂的最常见用途。

如果从get操作时刻开始使用该字符串,直到程序结束,可能会建议复制操作,因为您不希望向用户“做出承诺”关于生命周期的时间。字符串。

如果要在短时间内使用该字符串,请使用引用。

如果您的整个系统使用某些字符串存储库,则可确保所有字符串的生命周期都已知。您可以安全地从该存储库返回引用。

答案 3 :(得分:1)

通常,const引用是理想的。正如Kerrek所说,如果他们需要副本,他们可以自己制作。这可能导致问题的唯一地方完全取决于参考文献的接收者。例如,当const引用var是接收对象成员返回const引用的结果,并且该对象稍后被销毁而与引用变量的生命周期无关,那么你有效地“记住了” “一个不再有效的指针(松散术语);即:

const std::string& myref = myobj->getString();
...
delete myobj;

但是你应该知道这一点(因为你正在编写代码),因此应该首先计划避免它。 他们应该制作副本而不是参考,无论如何返回引用仍然是最佳做法。