我可以使用const引用而不是getter函数吗?

时间:2015-12-11 07:56:03

标签: c++ reference getter

我只是想知道如果我只允许使用const引用变量,是否可以绕过使用getter,如下所示

const_cast

我想知道为什么人们似乎根本就不这样做。我缺少一些严重的劣势吗?请提供优缺点列表,并在必要时予以纠正。

优点:

  1. 通过调用getter函数没有任何开销。
  2. 程序大小减少,因为功能较少。
  3. 我仍然可以修改类的内部,引用变量提供了一个抽象层。
  4. 缺点:

    1. 我有很多参考资料,而不是getter函数。这会增加对象的大小。
    2. 使用case CPTScatterPlotFieldX,人们可以搞砸私人会员,但是这些人都很顽皮,对吗?

3 个答案:

答案 0 :(得分:7)

确实存在一些严重的缺点(除了你提到的第二个缺点,我也提到了“严重”类别):

1)您需要提供(并因此维护)复制构造函数:编译器默认不起作用。

2)您需要提供赋值运算符:编译器默认值不起作用。

3)仔细考虑实现移动语义。同样,编译器默认不起作用。

这三件事意味着你提出的const参考反模式是非首发的。不要这样做!

答案 1 :(得分:2)

getter函数的一个优点是你可能在某个时间点 - 想要改变返回值 - 并且没有getter函数你就无法做到。这个场景要求你实际返回非引用,这在c ++中不太常见。 [编辑]但是使用移动语义而不是引用这应该是可行的[/ edit]

您可能还想在getter函数中放置一个断点,以了解谁正在读取其值,您可能想要添加日志记录等。这称为 封装

getter的其他优点是,在调试版本中,您可以对返回的数据添加额外的检查/断言。

最后,编译器将内联你的getter函数,这将导致与你提议的代码类似的代码。

一些额外的缺点:

1)模板代码希望使用函数调用获取值,即。 size(),如果将其更改为const&变量那么你将无法在某些模板中使用它。所以这是一个一致性问题。

答案 2 :(得分:0)

如果你想避免使用getter和setter,那么使用const引用成员不是解决方案。

相反,您需要确保周围结构的const正确性(它自动为您提供对成员的const访问权限),并让成员成为他们逻辑上需要的任何内容。

请务必阅读getter和setter何时,应该或可以与公共数据成员切换的内容。参见例如this question。请注意,如果您更改界面,那么setter / getters的预示优势在于调用getter不会影响调用站点。现实似乎不是在争论,例如对任何自尊的C ++代码编辑器来说,重构一个成员及其所有访问点是一项微不足道的操作。

虽然人们可能会争论封装,但我更强烈地争论const的正确性,这减少了对大量封装的需求,并且非常简化了代码。