1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

定数について

Last updated at Posted at 2022-05-10

const

constは変数の中身を変えたくないときに使います。
使用例として、ループの試行回数とか、固定型のキャラクターのパラメーターがあります。
そこで使うのが定数です。
enum文も定数になります。
定数を宣言すると、後から中身を変更することができません。
他のプログラマーが誤って変更しないように予防できます。
数字を直接入れるマジックナンバーがありますが、コード上読みづらくなるため避けましょう。

Explanation.cpp
    int a = 10; //変数
	const int loop_max = 5; //定数
	int result = 0;
	for (int i = 0; i < loop_max; i++)
	{
		result += a;
	}
    loop_max = 10; //エラー 定数なので変更できない。

マクロについて

定数をマクロで宣言することができます。
簡単に長所と短所に分けてまとめました。

  • 長所
    メモリを圧迫しない
    グローバルに扱うことが出来るので、別ファイルで共有しやすい。

  • 短所
    多少定義がめちゃくちゃでも、エラーや警告にならない。
    グローバルスコープなので名前衝突のリスクがあり、
    気づかなかった時にバグが起きやすい原因。

Explanation.cpp
#define loop_max 5
#define NUM 1.5f

constexprについて

定数には2種類あります。

  • コンパイル時定数
    コンパイル時に値が決定します。
    固定長配列のサイズやテンプレート引数に指定できます。

  • 実行時定数
    通常は実行時に計算されます。

つまりconstexprやマクロ定数はコンパイル時に値が計算されるので、
実行時の計算速度が速くなります。
しかし、問題点があってconstexprにすると、クラスに定義できなくなります。
解決策でconstexprを静的なデータメンバにします。
C++11以上なら、staticをつけることでinline変数として扱うことができます。

Explanation.cpp
class Test
{
private:
	constexpr int size = 5; //エラー
	constexpr static int size = 5; //inline constexpr ~と同じ
};

char*型について

文字リテラルを代入するにはcosnt char[]として
扱われるconst char* が適切です。
constexpr char* やstatic constexpr char* は禁止されています。

おわり

使う用途ごとに定数の定義方法を変えると良いと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?