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