Const 正確性
this
cv-qualifiers 的主要用途之一是 const
正確性 。這是保證只有訪問該實踐需要修改一個物件,是能夠修改的物件,並且任何(成員或非成員),其不需要修改一個物件不具有到該寫訪問功能物件(無論是直接還是間接)。這可以防止無意的修改,使程式碼更少錯誤。它還允許任何不需要修改狀態的函式能夠獲取 const
或非 const
物件,而無需重寫或過載該函式。
const
正確性,由於其性質,從下到上開始:任何不需要改變狀態的類成員函式都被宣告為 const
,因此可以在 const
例項上呼叫它。反過來,當不需要修改時,這允許傳遞引用引數 const
,這允許函式在不抱怨的情況下接受 const
或非 const
物件,並且 const
-ness 可以向外傳播方式。因此,getter 經常是 const
,任何其他不需要修改邏輯狀態的函式也是如此。
class ConstIncorrect {
Field fld;
public:
ConstIncorrect(const Field& f) : fld(f) {} // Modifies.
const Field& get_field() { return fld; } // Doesn't modify; should be const.
void set_field(const Field& f) { fld = f; } // Modifies.
void do_something(int i) { // Modifies.
fld.insert_value(i);
}
void do_nothing() { } // Doesn't modify; should be const.
};
class ConstCorrect {
Field fld;
public:
ConstCorrect(const Field& f) : fld(f) {} // Not const: Modifies.
const Field& get_field() const { return fld; } // const: Doesn't modify.
void set_field(const Field& f) { fld = f; } // Not const: Modifies.
void do_something(int i) { // Not const: Modifies.
fld.insert_value(i);
}
void do_nothing() const { } // const: Doesn't modify.
};
// ...
const ConstIncorrect i_cant_do_anything(make_me_a_field());
// Now, let's read it...
Field f = i_cant_do_anything.get_field();
// Error: Loses cv-qualifiers, get_field() isn't const.
i_cant_do_anything.do_nothing();
// Error: Same as above.
// Oops.
const ConstCorrect but_i_can(make_me_a_field());
// Now, let's read it...
Field f = but_i_can.get_field(); // Good.
but_i_can.do_nothing(); // Good.
正如關於 ConstIncorrect
和 ConstCorrect
的評論所示,正確的 cv 資格函式也可以作為文件。如果一個類是正確的,那麼任何不是 const
的函式都可以安全地被假定為改變狀態,並且可以安全地假設任何函式是 const
都不會改變狀態。