はじめに
C++プログラミングの根幹をなすのが「型」の概念です。全ての変数やオブジェクトは、必ず何らかの型を持ち、その型によって、どのような値を保持できるか、どのような操作が可能かが決まります。
この記事では、C++の型システムを構成する主要なデータ型について、その役割と使い方を網羅的に解説します。
1. 基本型 (Fundamental Types)
C++言語に組み込まれている、最も基本的なデータ型です。
型 | 説明 | 例 |
bool | 真偽値 (true / false ) | bool is_active = true; |
char | 1バイト文字 | char initial = 'A'; |
int | 整数 | int score = 100; |
double | 倍精度浮動小数点数 | double pi = 3.14; |
その他、short
, long
, long long
, float
, wchar_t
など、サイズや精度の異なる様々な基本型があります。
2. 複合型 (Compound Types)
基本型を組み合わせて作られる、より複雑な型です。
配列
同じ型の要素を、連続したメモリ領域に複数格納します。
// 5つの整数を格納する配列
int scores[5];
scores[0] = 90; // 最初の要素にアクセス
ポインタ (*
)
他の変数のメモリアドレスを格納するための変数です。*
(間接参照)で指し示す先の値に、&
(アドレス)で変数のアドレスを取得します。
int value = 10;
int* p_value = &value; // valueのアドレスをp_valueに格納
*p_value = 20; // p_valueが指す先(value)の値を20に変更
参照 (&
)
既存のオブジェクトの**別名(エイリアス)**として振る舞います。宣言時に必ず初期化が必要で、後から別のオブジェクトを指すようには変更できません。
int original = 100;
int& alias = original; // aliasはoriginalの別名
alias = 200; // aliasを変更すると、originalも200になる
3. ユーザー定義型 (User-Defined Types)
プログラマが独自に定義する新しいデータ型です。
列挙型 (enum
)
関連する一連の整数定数に、分かりやすい名前を付けます。
// スコープ付き列挙型 (C++11)
enum class Signal { Red, Yellow, Green };
Signal light = Signal::Red;
if (light == Signal::Red) { /* ... */ }
enum class
を使うと、列挙子が名前空間のようにスコープを持つため、名前の衝突を防げます。
構造体 (struct
) と クラス (class
)
異なる型の複数の変数を、一つのまとまりとして扱うための設計図です。データ(メンバ変数)と操作(メンバ関数)をカプセル化します。
struct Player {
string name;
int level;
};
Player hero;
hero.name = "勇者";
hero.level = 10;
共用体 (union
)
複数のメンバが、同じメモリ領域を共有する特殊な構造体です。一度に一つのメンバしか有効な値を保持できません。
union Data {
int i;
float f;
char str[4];
};
ビットフィールド
構造体の中で、メンバ変数が使用するビット数を明示的に指定できます。メモリを極限まで節約したい場合や、ハードウェアレジスタを直接操作する際に使います。
struct Flags {
unsigned int is_active : 1; // 1ビット
unsigned int mode : 2; // 2ビット
unsigned int : 5; // 5ビットの空き
};
まとめ
今回は、C++の型システムを構成する主要なデータ型を網羅的に解説しました。これらの型を正しく理解し、適切に使い分けることが、安全で効率的なC++プログラムを書くための基礎となります。