ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
C++で定数を宣言するには、変数の型の前に const を付けて const int MAX = 100; のように書く。これで MAX は再代入できない読み取り専用の値になる。コンパイル時に値を確定させたい場合は C++11 以降の constexpr を使い、古いコードで見かける #define マクロは型を持たないため現在は const や constexpr が推奨される。
| この記事の要点 |
|---|
|
constによる定数の宣言
もっとも基本的な定数の宣言は const キーワードを使う方法である。型の前(または後ろ)に const を付けると、その変数は初期化した値のまま変更できなくなる。
|
const int MAX = 100; const double PI = 3.14159; MAX = 200; // エラー:再代入はできない |
const int MAX = 100; と int const MAX = 100; は同じ意味で、どちらも有効である。一般には型の前に書く前者の書き方が広く使われている。
重要なのは、const は宣言と同時に初期化が必須という点である。次のように分けて書くことはできない。
|
const int a; // エラー:初期化されていない定数 a = 1; // ここで代入することもできない |
constexprによるコンパイル時定数(C++11)
C++11 で導入された constexpr は、コンパイル時に値が確定する定数を宣言するためのキーワードである。const は「実行時に変更されない」ことを保証するが、値の確定がコンパイル時とは限らない。一方 constexpr は、その値がコンパイル時に計算可能であることをコンパイラに要求する。
|
constexpr int SIZE = 10; int buffer[SIZE]; // コンパイル時定数なので配列サイズに使える |
配列のサイズやテンプレート引数など、コンパイル時に値が決まっていなければならない場所では constexpr が役立つ。関数に付けて、コンパイル時に計算可能な関数を定義することもできる。
|
constexpr int square(int x) { return x * x; } constexpr int N = square(5); // コンパイル時に 25 が確定する |
コンパイル時に値が確定できるものは、できるだけ constexpr で宣言すると意図が明確になり、実行時のコストも避けられる。
#defineマクロとの違い
C言語の頃から使われてきた #define でも定数のような名前を定義できる。しかしこれはプリプロセッサによる単純な文字列置換であり、型を持たない点が const / constexpr と根本的に異なる。
|
// プリプロセッサが MAX をそのまま 100 に置き換えるだけ #define MAX 100 int buffer[MAX]; |
#define には次のような弱点がある。
- 型が無い:型チェックが効かず、意図しない変換が起きても警告されにくい。
- スコープを無視する:名前空間やブロックに関係なく、ファイル全体(インクルード先も含む)で置換される。
- デバッグしづらい:置換後の値しか残らず、デバッガで名前を追えないことがある。
これらの理由から、現在のC++では定数に #define を使うことは避け、型安全な const や constexpr が推奨される。
constの位置:ポインタの定数
ポインタに const を付ける場合、const を書く位置によって意味が変わるため注意が必要である。大きく分けて「指す先の値が定数」か「ポインタ自身が定数」かの2種類がある。
|
int x = 1, y = 2;
// (1) 指す先の値が定数(ポインタの付け替えは可) const int* p = &x; *p = 10; // エラー:値は変更できない p = &y; // OK:指す先は変えられる
// (2) ポインタ自身が定数(指す先の値は変更可) int* const q = &x; *q = 10; // OK:値は変更できる q = &y; // エラー:付け替えできない |
覚え方として、const は「すぐ右にあるものを固定する」と考えると整理しやすい。const int* は int(=指す先の値)を固定し、int* const は *(=ポインタ)を固定する。両方を固定したい場合は const int* const と書く。
enumによる定数群
関連する複数の定数をまとめて扱いたいときは、列挙型 enum が便利である。連続した整数値に名前を付けたいケースで特に有効である。
|
enum Color { RED, // 0 GREEN, // 1 BLUE // 2 }; Color c = RED; |
値を明示しなければ 0 から順に割り当てられる。C++11 以降では、より型安全な enum class も利用できる。enum class では Color::RED のようにスコープ付きでアクセスし、名前の衝突や暗黙の整数変換を防げる。
|
enum class Color { RED, GREEN, BLUE }; Color c = Color::RED; // スコープ付きでアクセスする |
const・constexpr・#define・enumの比較
定数を表す主な手段を整理すると次のようになる。基本的には型安全な const / constexpr を選び、コンパイル時の確定が必要なら constexpr を使うのがよい。
| 手段 | 型 | 値の確定 | スコープ | 主な用途 |
|---|---|---|---|---|
constexpr |
あり | コンパイル時 | 従う | 配列サイズ等の定数(C++11以降) |
const |
あり | 実行時もあり得る | 従う | 一般的な変更不可の値 |
#define |
なし | 前処理時の置換 | 無視する | 条件コンパイル等(定数には非推奨) |
enum |
整数系 | コンパイル時 | 従う | 関連する整数定数のグループ化 |
関連する基本:変数の宣言
定数は「再代入できない変数」とも言える。値を保持する仕組みそのものは通常の変数と共通しているため、まず変数の宣言と初期化を理解しておくと const の挙動も把握しやすい。詳しくは 変数の宣言 を参照してほしい。
落とし穴
| よくある落とし穴 |
|---|
|
よくある質問(FAQ)
Q. const と constexpr はどちらを使えばよいですか。
A. コンパイル時に値が確定できるなら constexpr を、そうでない(実行時に決まる値を変更不可にしたい)なら const を使うとよい。配列サイズやテンプレート引数のようにコンパイル時定数が必須の場所では constexpr が必要になる。
Q. 定数の名前はどう書くのが一般的ですか。
A. 慣習として MAX_SIZE のように大文字とアンダースコアで書くスタイルがよく使われる。ただし言語規則ではないため、プロジェクトの命名規約に従うのがよい。constexpr では小文字で書くスタイルも見られる。
Q. クラスのメンバを定数にできますか。
A. できる。クラス内で static constexpr を使うと、クラスに属するコンパイル時定数を宣言できる。インスタンスごとに固定したい場合は const メンバを使い、コンストラクタの初期化リストで初期化する。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?