オブジェクトを変更したい場合は、作成しないでくださいconst。constたとえば、を介してオブジェクトを変更することconst_castは、未定義の動作です。
constしたがって、には使用しないでください。ただし、コードで使用できるものm_dataは他にもいくつかあります。const
- 関数の引数は。で保護できます
const。通常、ポインタではなく、ポインタが指すオブジェクトを気にするので、これは通常あまり意味がありません。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またはnon-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