问题历史:
C++ 中的 const 限定符出于安全考虑而出现:标记那些保证不改变对象内部状态的函数。在类的上下文中,const 方法对于要求严格封装和防止意外错误的项目是必需的。
问题:
如果忘记将获取器、辅助函数和检查方法标记为 const,则无法对 const 对象进行调用。没有 const 方法,编译器无法防止不必要的数据更改。
解决方案:
在方法声明中在签名之后添加 const(而不是之前!) 这允许对普通对象和声明为 const 的对象调用该方法,避免了状态更改的错误。在这样的一个方法内部无法更改类的成员(除了 mutable),只允许读取。
代码示例:
class Counter { int value; public: int getValue() const { return value; } // 可以对 const Counter 调用 }; void print(const Counter& c) { std::cout << c.getValue(); }
关键特性:
方法中的 const 应该写在哪里:在返回值之前还是在括号之后?
只能在括号之后:int getValue() const; — 在返回值类型之前写是错误的(例如,const int get();)。
const 方法能否调用非 const 的类方法?
不可以,const 方法只能调用其他 const 方法,如果对象是 const 的话。
方法中的 const 与返回值中的 const 有什么区别?
int get() const(方法不改变状态)
const int get();(返回值不能被修改,但方法可以改变内部数据)
在类中漏掉了 const,而该方法并不改变状态。对常量对象无法调用,妨碍了在分析工具和 API 中使用该类。
优点:
缺点:
所有获取器、检查和辅助方法都已用 const 声明,测试已覆盖 const 和非 const 对象。
优点:
缺点: