如果您想要修改對象,請不要使它成爲const
。修改const
對象,例如通過const_cast
,是未定義的行爲。
所以不要使用const
爲m_data
,但也有其他幾個const
S的,你可以在你的代碼中使用:
- 可以保護功能參數與
const
。這通常不是很有意義,因爲您通常不關心指針,而是關注它指向的對象。但它可以幫助您避免像在你的代碼不小心repointing d
錯誤:
void set_data(Data * const d); // const pointer to (non-const) Data
// this means the function can not change d (the pointer), but it can
// change the object that d points to.
- 你可以不修改功能
const
。這聲明函數不會以任何方式更改對象(除非有成員mutable
)。如果您嘗試修改此功能中的任何成員,編譯器將會報錯。這些功能也是唯一可以在const
對象上調用的功能。
Data * get_data() const; // this function doesn't change anything
需要注意的是,如果你有mutable
成員,他們可以從const函數改變,但是這不應該被濫用。這是爲了內部的東西,如互斥或緩存。
還要注意引用總是const
- 它們不能被重新分配指向另一個對象。它們引用的對象可以是const或非const。
最後的技巧:閱讀聲明從右到左:
Data * d; // pointer to Data (both can be changed)
Data * const d; // const pointer to Data (data can be changed)
Data const * d; // pointer to const Data (pointer can be changed)
Data const * const d; // const pointer to const Data (neither can be changed)
Data & d; // reference to non-const Data
//Data & const d; // invalid - all references are const
Data const & d; // reference to const Data
//Data const & const d; // invalid - all references are const
謝謝。這就說得通了。我想執行的「合同」,在該呼叫的方法不應該改變過的數據,我可以把它與它的工作之前,爲const: 無效set_data(數據* in_d) \t \t \t { \t \t \t \t const Data * d = in_d; //傳遞的數據不會在此呼叫 \t \t \t \t //....work與d被改變 \t \t \t \t M_DATA = in_d; \t \t \t}; – user1057165
@ user1057165我會遠離const施放。 –