我只是想知道如果我只允许使用const引用变量,是否可以绕过使用getter,如下所示
const_cast
我想知道为什么人们似乎根本就不这样做。我缺少一些严重的劣势吗?请提供优缺点列表,并在必要时予以纠正。
优点:
缺点:
case CPTScatterPlotFieldX
,人们可以搞砸私人会员,但是这些人都很顽皮,对吗?答案 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的正确性,这减少了对大量封装的需求,并且非常简化了代码。