基本型¶
C++ ではじめから使用できる基本型について説明します。
bool¶
bool
は真偽値を表す型で true
または false
が設定できます。
bool ok = true;
char¶
char
はアスキー文字1文字を表現する型です。
ただし内部表現はアスキーコードの整数値として扱われ、
標準出力などに出力する際に文字に変換されて出力されます。
char x = 'x';
数値¶
数値を表現する型は複数種類用意されています。
整数型¶
整数を表現するための型です。
char
short
int
long
下に行くに連れて大きな値が表現できるようになり、変数のサイズも増大します。
具体的なサイズはコンパイラによって変わってきますが
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_t
std::int16_t
std::int32_t
std::int64_t
std::uint8_t
std::uint16_t
std::uint32_t
std::uint64_t
数値は型のビットサイズを表しており、u は unsigned
を表しています。
サイズ指定付き整数型を使用する場合は #include <cstdint>
と記述する必要があります。
#include <cstdint>
std::int32_t x = 5;
浮動小数点型¶
小数を表現する型は次の2つの型があります。
float
double
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
};