const 概要

これは,C++プログラマであるかを見分ける10の質問 - Life like a clown の「const の機能について概要を説明せよ」と言う質問に対する回答的な記事です.こんな時ですが,できるだけ平常更新を続けます.

C++ の const には大きく分けて 2つの役割があります.まず,基本的には const で宣言する事によって値が変更できなくなる(値を変更しようとするとコンパイルエラー)と言う役割があります.

const ing a = 100; // この値は変更不可

この機能を利用して,「ちょっとした一時変数であっても const にできる変数はできるだけ const 宣言し,想定外のエラーを減らそう(コンパイル時エラーで気付けるようにしよう)」と言うコーディングスタイルも提唱されていたりします.

さて,C++ のコードにおいて const をよく見かける機会は,「関数の引数」,「メンバ関数(メソッド)の宣言」の 2通りになります.

パラメータ

もっとも一般的なconstの使用方法としては、ポインタで指定されているオブジェクトや参照されているオブジェクトのデータの保護になります:

void func ( const MyObject * data ); // MyObjectはfuncの中では変更できません
void func ( const MyObject & data ); // MyObjectはfuncの中では変更できません

・・・(中略)・・・

メソッド

オブジェクトの内部のデータを変更しないインスタンスメソッドというのもよく作成されます。

・・・(中略)・・・

void MyClass::func ( MyOjbect & data ) const; // この関数はクラスのデータを変更することはできません

もしもconstのオブジェクトがあったとしたら、そのオブジェクトの中のメソッドのうち、呼び出せるのはconstの付いたメソッドだけです。理由としては、通常のメソッドが呼べてしまうとすると、そのオブジェクトのポインタをthisポインタとして渡す必要があります。しかし、そのクラスがconstが付いた”const MyClass”オブジェクトだったとすると、”MyClass *”ではなくて、”const MyClass *”しか得ることができませんので、constメソッドしか呼べないのです。

void MyClass::const_func() const;
void MyClass::func();
 
const MyClass object;
 
object.const_func(); // ok
object.func(); // constオブジェクトの非constクラスは呼ぶことができません

同様の理由で、constメソッドの中からそのオブジェクトのメソッドを呼ぶ場合には、他のconstメソッドしか呼ぶことはできません。

C + +のキーワード:const - cppreference.com

関数やクラスの設計で const 周りがおざなりの場合,const 付で渡されたが const メンバ関数が一つも定義されていないので const_cast を使うしかない,と言う状況がしばしば発生するので,この辺りの設計は注意して行う必要があります.