我已经阅读了关于3 different conventions for accessor methods的社区维基查询,并且看到以下约定并不令人惊讶:
const unsigned& amount() const { return _amount; }
unsigned& amount() { return _amount; }
是的,它与无缝完全不同,因为能够完全避免括号() - 这会(我觉得)是想法 - 但它仍然是某种东西;正确?
答案 0 :(得分:8)
它破坏了访问者的目的。如果你提供两个 函数,你也可以将数据成员公之于众 完成它。
编辑:
只是为了让事情变得非常明确: 案例在哪里
使用C样式struct
是最合适的解决方案。在
这些情况下,您将数据成员公开,不要担心
关于访问者。对于具有重要行为的类,在
另一方面,你根本不会有访问者,或者很少。对于
大多数情况下,内部状态不直接反映在
公共接口(以及通常读取的状态)
只要)。关于你唯一需要访问器的时间是
类基本上是数据,但必须强制执行
数据中的不变量,
(以及它的价值:如果数据在逻辑上是一个属性 在课堂上,我用:
int amount() const { return myAmount; }
void amount( int newValue ) { myAmount = newValue; }
对于不具有逻辑属性的值的getter,
但是,我会使用getAmount()
。)
答案 1 :(得分:2)
您的第二个示例允许用户访问类中的原始_amount
,而不受类本身的任何形式的保护。 “封装”的目的,是OOP的一个重要方面,是确保对变量的所有访问都在类本身内完成 - 这样类可以控制值范围或其他有效性。
如果您希望该类透明地允许用户使用amount
,请将其命名为amount
并将其公开。那时就不需要访问器功能了。
答案 2 :(得分:0)
这个问题是它可能会破坏getter / setter约定的目的。如果你将一个可变引用传递给私有成员,你也可以公开该成员并消除函数调用的麻烦。
另外,我发现这种语法非常难看且不可读,但这是我的个人品味:
foo.amount() = 23;