编程C++ 初级开发者

C++ 中的 const 方法是什么?它们的应用对程序的安全性和语法有何影响?

用 Hintsage AI 助手通过面试

回答。

问题历史:

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 方法不能改变对象的状态(除了 mutable 字段)
  • const 方法可以对 const 对象和 const 引用调用
  • const 方法也可以对非常量对象调用

误导性问题。

方法中的 const 应该写在哪里:在返回值之前还是在括号之后?

只能在括号之后:int getValue() const; — 在返回值类型之前写是错误的(例如,const int get();)。

const 方法能否调用非 const 的类方法?

不可以,const 方法只能调用其他 const 方法,如果对象是 const 的话。

方法中的 const 与返回值中的 const 有什么区别?

int get() const(方法不改变状态) const int get();(返回值不能被修改,但方法可以改变内部数据)

常见错误和反模式

  • 不标记应该为 const 的方法(获取器和检查)
  • 通过 cast 或 mutable 通过 const 方法更改对象状态
  • 在返回值类型之前放置 const,认为这是 const 方法

生活示例

消极案例

在类中漏掉了 const,而该方法并不改变状态。对常量对象无法调用,妨碍了在分析工具和 API 中使用该类。

优点:

  • 不需要考虑在哪里放置 const,编写代码更快

缺点:

  • 不能通过 const 引用使用对象
  • 允许在未预期的地方改变对象

积极案例

所有获取器、检查和辅助方法都已用 const 声明,测试已覆盖 const 和非 const 对象。

优点:

  • 使用安全
  • 与 const 容器、算法和 API 兼容

缺点:

  • 需要在支持 const 正确性方面的纪律
  • 有时候会使编写测试和 mock 对象变得困难(如果需要通过 mutable 提供可变成员)