基本型¶
C++ ではじめから使用できる基本型について説明します。
bool¶
bool は真偽値を表す型で true または false が設定できます。
bool ok = true;
char¶
char はアスキー文字1文字を表現する型です。
ただし内部表現はアスキーコードの整数値として扱われ、
標準出力などに出力する際に文字に変換されて出力されます。
char x = 'x';
数値¶
数値を表現する型は複数種類用意されています。
整数型¶
整数を表現するための型です。
charshortintlong
下に行くに連れて大きな値が表現できるようになり、変数のサイズも増大します。
具体的なサイズはコンパイラによって変わってきますが
GCC では 8, 16, 32, 64 ビットで定義されています。
一般的には int が使用されます。
符号付き・符号なし整数型¶
各整数型に unsigned を付けると正の数しか表現できなくなる代わりに
大きな値が表現できるようになります。
unsigned int x = 4000000000;
signed を付けると正負両方の値が表現できます。
明示的に付けなくてもデフォルトは signed になります。
char は signed char じゃない?
C++ では char, signed char, unsigned char はそれぞれ異なる型として定義されています(C言語も同様です)。
プレーンな char 型が符号付き・符号なしのいずれになるかは、仕様上は処理系定義(implementation-defined)とされています。
実際にはコンパイラオプションで符号有無を選択できたり、対象プロセッサアーキテクチャなどから決まるのが一般的です。
移植性のあるコードを書く場合は十分注意して下さい。
サイズ指定付き整数型¶
上述の整数型は型のサイズがコンパイラによってまちまちなので 複数のコンパイラに対応するプログラムを書くときは 移植性の面で問題が発生することがあります。 そのようなときはサイズ指定付き整数型を使用します。
std::int8_tstd::int16_tstd::int32_tstd::int64_tstd::uint8_tstd::uint16_tstd::uint32_tstd::uint64_t
数値は型のビットサイズを表しており、u は unsigned を表しています。
サイズ指定付き整数型を使用する場合は #include <cstdint> と記述する必要があります。
#include <cstdint>
std::int32_t x = 5;
浮動小数点型¶
小数を表現する型は次の2つの型があります。
floatdouble
float は 32 ビットの大きさを持ち、double は 64 ビットの大きさを持ちます。
また double の方が float に比べて計算精度が高いですが数値計算の
パフォーマンスは低いです。
列挙型¶
列挙型は、名前を付けた定数(列挙子)の集合を扱う型です。
enum¶
列挙型である enum を定義するには次のようにします。
enum Day {
Sun, // 0
Mon, // 1
Tue, // 2
Wed, // 3
Thu, // 4
Fri, // 5
Sat // 6
};
enum の各列挙子は、内部では整数として扱われています。
各列挙子の定義の際に値を指定しなければ、 0 から順に値が割り振られます。
列挙子 = 整数 と書くことで値を指定することができます。値が指定された列挙子以降は、順に整数が割り振られます。
enum Day {
Sun = 1, // 1
Mon, // 2
Tue, // 3
Wed = 8, // 8
Thu, // 9
Fri, // 10
Sat // 11
};
enum を扱うには次のようにします。
Day day = Fri;
数値型に enum の値を代入することは可能ですが、 enum に数値を直接代入することは出来ません。
int x = Fri; // OK
Day day = 5; // コンパイルエラー
列挙子の名前は被らないようにする必要があります。
enum Day {
Sun,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
};
enum SolarSystem {
Sun, // Sun は enum Day 内で定義済みのためコンパイルエラー
Mercury,
Venus,
Earth,
Mars,
Jupiter,
Saturn,
Uranus,
Neptune
};
enum class¶
enum class で列挙型を定義することもできます。
enum class Day {
Sun,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
};
基本的には enum と同じですが、以下の点が異なります。
enum class を扱うには 型名::列挙子名 とします。
Day day = Day::Fri; // OK
Day day = Fri; // コンパイルエラー
明示的に型変換をしない限り、数値型に enum class の値の代入はできません。
int x = Day::Fri; // コンパイルエラー
enum class の場合、列挙子の名前は型ごとに区別されるため、
他の列挙型の列挙子と名前が被っても問題ありません。
enum class Day {
Sun, // Day::Sun
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
};
enum class SolarSystem {
Sun, // Day::Sun と SolarSystem::Sun は区別されるためOK
Mercury,
Venus,
Earth,
Mars,
Jupiter,
Saturn,
Uranus,
Neptune
};