基础
const
正确性是如此,只有那些代码设计代码的做法需要修改一个实例是能够修改一个实例(也就是有写权限),相反,这并不需要修改实例的任何代码是无法做到所以(即只有读访问权限)。这可以防止实例无意中被修改,使代码更少错误,并记录代码是否旨在更改实例的状态。它还允许实例在不需要修改时被视为 const
,或者如果在初始化后不需要更改则定义为 const
,而不会丢失任何功能。
这是通过给成员函数 const
CV-qualifiers ,以及通过制作指针/引用参数 const
来完成的,除非它们需要写访问权限。
class ConstCorrectClass {
int x;
public:
int getX() const { return x; } // Function is const: Doesn't modify instance.
void setX(int i) { x = i; } // Not const: Modifies instance.
};
// Parameter is const: Doesn't modify parameter.
int const_correct_reader(const ConstCorrectClass& c) {
return c.getX();
}
// Parameter isn't const: Modifies parameter.
void const_correct_writer(ConstCorrectClass& c) {
c.setX(42);
}
const ConstCorrectClass invariant; // Instance is const: Can't be modified.
ConstCorrectClass variant; // Instance isn't const: Can be modified.
// ...
const_correct_reader(invariant); // Good. Calling non-modifying function on const instance.
const_correct_reader(variant); // Good. Calling non-modifying function on modifiable instance.
const_correct_writer(variant); // Good. Calling modifying function on modifiable instance.
const_correct_writer(invariant); // Error. Calling modifying function on const instance.
由于 const 正确性的性质,这从类的成员函数开始,并向外运行; 如果你试图从 const
实例调用非 const
成员函数,或者从被视为 const
的非 const
实例调用,编译器会给你一个关于它丢失 cv-qualifiers 的错误。