ViVi Home > 技術文書
> さくさく理解する C/C++ コンソールアプリ入門 >
手を動かしてさくさく理解する C++ const 修飾子 入門
「const」は「constant」の省略形で、「定数」という意味だ。値が変化しないこと、つまり「変更不可」を意味する。
下記の様に変数宣言または関数宣言時に「const」を付加することで、付加された変数または関数が定数であることを宣言する。
const int var = 123; const char *ptr = 0; class Hoge { void func() const; };const 修飾子を付加することで、変数・引数・関数などに変更不可という制限を課すことで、ソースコードの安全性を向上させることが出来る。 と言っても何のことかすぐにはすぐにはピンと来ないかもしれないが、本稿を読み進めば理解できるようになるはずだ。
本稿では、それぞれの種類について具体的に解説し、お約束の演習問題も用意している。 理解しづらい概念も、手を動かして演習問題を解いていけば誰でもマスターできるものなので、ちゃんと演習問題をクリアーしてほしい。
変数なのに定数とはこれいかに、ではあるが、下記のように、ローカル変数・グローバル変数宣言に const を指定すると、変数が変更禁止になる。
const double PAI = 3.1415926535; // double 型円周率定数を宣言 int main() { const int N = 100; // 値100の int 型定数を宣言 for(int i = 0; i < N; ++i) { ..... } ..... return 0; }
要するにシンボルに定数を割り当て、ソースコードの文書性・メンテナンス性を向上させようということだ。
const は、通常型の前に記述するが、型の直後に書いてもよい。
double const PAI = 3.1415926535;
C/C++ で定数を宣言するには、この方法以外にも下記の様に #define を使用する方法、enum を使用する方法がある。
#define PAI 3.1415926535 enum { IPAI = 3, };
#define と比べて const 変数は、
という利点がある。
enum と比べた場合、
という利点がある。
enum はシーケンシャルな番号を生成可能という利点がある。
演習問題:(解答例は省略)
以下のように、ポインタ宣言に const を指定すると、ポインタが指す先のデータを変更不可となる。
const char * ptr = &v[0]; // const なポインタを宣言・初期化 *ptr = 0; // コンパイルエラーとなる
const を記述する位置は * の直前でもよい。
char const * ptr = &v[0];
コーディング規約次第だが、型の前に const を書く方がポピュラーな気がする。
ポインタが指す先のデータを変更不可なだけで、ポインタを移動することは可能。
const char * ptr = &v[0]; // const なポインタを宣言・初期化 ptr = &v[1]; // ポインタの再初期化はOK ++ptr; // ポインタの移動もOK
引数に const を指定できる。特に、ポインタまたは参照引数の場合、関数内でその参照先が変更されてないことを保証する。
クラス宣言時に、メンバ変数宣言に const を指定出来る。
const を指定したメンバ変数は変更することが出来ない。
class Hoge { ..... private: const int m_var; public: void func() { m_var = 123; // const メンバ変数への代入はコンパイルエラー } };
class Hoge { public: Hoge() : m_var(123) // const メンバ変数の初期化 { } Hoge(int var) : m_var(var) // const メンバ変数の初期化 { } ..... private: const int m_var; };
class Hoge { ..... private: const int m_var = 123; // C++11 以上であれば、初期値を指定可能 };