const
constは変数の中身を変えたくないときに使います。
使用例として、ループの試行回数とか、固定型のキャラクターのパラメーターがあります。
そこで使うのが定数です。
enum文も定数になります。
定数を宣言すると、後から中身を変更することができません。
他のプログラマーが誤って変更しないように予防できます。
数字を直接入れるマジックナンバーがありますが、コード上読みづらくなるため避けましょう。
int a = 10; //変数
const int loop_max = 5; //定数
int result = 0;
for (int i = 0; i < loop_max; i++)
{
result += a;
}
loop_max = 10; //エラー 定数なので変更できない。
マクロについて
定数をマクロで宣言することができます。
簡単に長所と短所に分けてまとめました。
-
長所
メモリを圧迫しない
グローバルに扱うことが出来るので、別ファイルで共有しやすい。 -
短所
多少定義がめちゃくちゃでも、エラーや警告にならない。
グローバルスコープなので名前衝突のリスクがあり、
気づかなかった時にバグが起きやすい原因。
#define loop_max 5
#define NUM 1.5f
constexprについて
定数には2種類あります。
-
コンパイル時定数
コンパイル時に値が決定します。
固定長配列のサイズやテンプレート引数に指定できます。 -
実行時定数
通常は実行時に計算されます。
つまりconstexprやマクロ定数はコンパイル時に値が計算されるので、
実行時の計算速度が速くなります。
しかし、問題点があってconstexprにすると、クラスに定義できなくなります。
解決策でconstexprを静的なデータメンバにします。
C++11以上なら、staticをつけることでinline変数として扱うことができます。
class Test
{
private:
constexpr int size = 5; //エラー
constexpr static int size = 5; //inline constexpr ~と同じ
};
char*型について
文字リテラルを代入するにはcosnt char[]として
扱われるconst char* が適切です。
constexpr char* やstatic constexpr char* は禁止されています。
おわり
使う用途ごとに定数の定義方法を変えると良いと思います。