オブジェクトを変更したい場合は、作成しないでください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