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);有人不小心在函数中直接修改了向量以进行调试,忘记删除这段代码。这引发了副作用,在测试中几乎未被察觉,并仅在生产环境中出现。