基礎
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 的錯誤。