编程C++开发者

const-correctness在C++中是如何工作的?为什么使用const修饰符很重要,以及const-correctness可以避免哪些错误?请给出使用const的实际示例。

用 Hintsage AI 助手通过面试

答案。

const-correctness是C++中的一个概念,它定义了变量、指针、引用和方法如何标记为“只读”。这提高了代码的安全性,使类的接口更加明确,并允许编译器在编译阶段捕获错误,而不是在执行时。

使用const修饰符很重要,因为:

  • 明确区分哪些方法和函数不修改对象/数据。
  • 防止意外修改不应改变的数据。
  • 帮助编译器优化代码。

示例:

class MyArray { public: int getItem(size_t idx) const { // 不修改对象 return arr[idx]; } void setItem(size_t idx, int value) { arr[idx] = value; } private: int arr[10]; };

这里的方法getItem保证不会修改对象。

难题。

void foo(const int* ptr);void foo(int* const ptr); 有什么区别?

正确答案:

  • const int* ptr — 指向常量值的指针,值不可修改,指针可以修改。
  • int* const ptr常量指针指向可修改值,指针不可修改,值可以修改

由于对主题细节不熟悉而导致的实际错误示例。


故事
在一个大型项目中,编写了一个没有const修饰符的类方法: int MyClass::getVal(); 因此无法将类对象用作const引用,例如,在仅处理“只读”对象的函数中。这限制了代码的重用,并导致了对象的多次复制。


故事
开发人员错误地通过一个非const方法返回了对内部数据的引用: int& MyClass::getInt(); 结果是客户端代码有机会修改类的私有字段,这导致状态意外改变和难以捕捉的错误。


故事
在函数中将const参数保留不加const: void printVector(std::vector<int>& v); 有人不小心在函数中直接修改了向量以进行调试,忘记删除这段代码。这引发了副作用,在测试中几乎未被察觉,并仅在生产环境中出现。