[C++] enumの初期値は何?初期値を変更する方法も解説
C++のenum
では、各列挙子の初期値はデフォルトで0から始まり、順に1ずつ増加します。
例えば、enum Color {Red, Green, Blue};
の場合、Red=0
、Green=1
、Blue=2
となります。
初期値を変更するには、列挙子に明示的な値を割り当てます。
例えば、enum Color {Red=10, Green=20, Blue=30};
のように記述すると、Red=10
、Green=20
、Blue=30
となります。
enumの初期値について
C++におけるenum
(列挙型)は、関連する定数の集合を定義するための便利な機能です。
enum
を使用すると、コードの可読性が向上し、定数を管理しやすくなります。
enum
の初期値は、特に明示的に指定しない限り、最初の列挙子に自動的に割り当てられます。
具体的には、最初の列挙子は0から始まり、以降の列挙子は前の値に1を加えた値が割り当てられます。
以下に、enum
の初期値の例を示します。
#include <iostream>
enum Color {
Red, // 初期値は0
Green, // 初期値は1
Blue // 初期値は2
};
int main() {
std::cout << "Redの値: " << Red << std::endl; // 0
std::cout << "Greenの値: " << Green << std::endl; // 1
std::cout << "Blueの値: " << Blue << std::endl; // 2
return 0;
}
Redの値: 0
Greenの値: 1
Blueの値: 2
この例では、Color
というenum
を定義し、Red
、Green
、Blue
の3つの色を列挙しています。
Red
は初期値0を持ち、以降のGreen
とBlue
はそれぞれ1と2の値を持っています。
これにより、各色を数値で簡単に扱うことができます。
enumの初期値を変更する方法
C++のenum
では、初期値を明示的に指定することができます。
これにより、デフォルトの0から始まる値を変更し、任意の整数値から列挙を開始することが可能です。
初期値を変更するには、最初の列挙子に対して値を指定します。
以降の列挙子は、前の値に1を加えた値が自動的に割り当てられます。
以下に、初期値を変更する例を示します。
#include <iostream>
enum Status {
Pending = 1, // 初期値を1に設定
InProgress, // 初期値は2
Completed // 初期値は3
};
int main() {
std::cout << "Pendingの値: " << Pending << std::endl; // 1
std::cout << "InProgressの値: " << InProgress << std::endl; // 2
std::cout << "Completedの値: " << Completed << std::endl; // 3
return 0;
}
Pendingの値: 1
InProgressの値: 2
Completedの値: 3
この例では、Status
というenum
を定義し、Pending
の初期値を1に設定しています。
これにより、InProgress
は2、Completed
は3の値を持つことになります。
初期値を変更することで、特定のビジネスロジックや要件に合わせた列挙型を作成することができます。
enum classとの違いと初期値の扱い
C++11以降、enum class
(列挙クラス)が導入され、従来のenum
といくつかの重要な違いがあります。
enum class
は、型安全性を提供し、名前の衝突を防ぐためにスコープを持つ列挙型です。
これにより、同じ名前の列挙子が異なるenum class
内で存在できるようになります。
enumとenum classの主な違い
特徴 | enum | enum class |
---|---|---|
スコープ | グローバルスコープ | 自身のスコープを持つ |
型安全性 | 型安全ではない | 型安全 |
初期値の扱い | 自動的に0から開始 | 自動的に0から開始 |
明示的な型指定 | 不要 | 必要 |
初期値の扱い
enum class
でも、初期値はデフォルトで0から始まります。
初期値を変更することも可能ですが、enum class
の列挙子は、スコープ内でのアクセスが必要です。
以下に、enum class
の初期値の例を示します。
#include <iostream>
enum class Direction {
North = 1, // 初期値を1に設定
East, // 初期値は2
South, // 初期値は3
West // 初期値は4
};
int main() {
std::cout << "Northの値: " << static_cast<int>(Direction::North) << std::endl; // 1
std::cout << "Eastの値: " << static_cast<int>(Direction::East) << std::endl; // 2
std::cout << "Southの値: " << static_cast<int>(Direction::South) << std::endl; // 3
std::cout << "Westの値: " << static_cast<int>(Direction::West) << std::endl; // 4
return 0;
}
Northの値: 1
Eastの値: 2
Southの値: 3
Westの値: 4
この例では、Direction
というenum class
を定義し、North
の初期値を1に設定しています。
enum class
を使用することで、型安全性が向上し、他の列挙型との名前の衝突を避けることができます。
初期値の扱いはenum
と同様ですが、アクセス時にはスコープを考慮する必要があります。
実践例:enumの初期値を活用する
enum
の初期値を活用することで、プログラムの可読性や保守性を向上させることができます。
ここでは、enum
を使用して、簡単な状態管理を行うプログラムの例を示します。
この例では、タスクの状態を管理するためにenum
を使用し、初期値を設定して状態遷移を行います。
タスクの状態管理
以下のコードでは、タスクの状態を表すenum
を定義し、タスクの状態を変更する関数を実装しています。
初期値をNotStarted
に設定し、タスクの進行状況に応じて状態を変更します。
#include <iostream>
enum TaskStatus {
NotStarted = 0, // 初期値を0に設定
InProgress, // 初期値は1
Completed // 初期値は2
};
void printTaskStatus(TaskStatus status) {
switch (status) {
case NotStarted:
std::cout << "タスクは未開始です。" << std::endl;
break;
case InProgress:
std::cout << "タスクは進行中です。" << std::endl;
break;
case Completed:
std::cout << "タスクは完了しました。" << std::endl;
break;
}
}
int main() {
TaskStatus task = NotStarted; // 初期値を設定
printTaskStatus(task); // タスクは未開始です。
task = InProgress; // 状態を変更
printTaskStatus(task); // タスクは進行中です。
task = Completed; // 状態を変更
printTaskStatus(task); // タスクは完了しました。
return 0;
}
タスクは未開始です。
タスクは進行中です。
タスクは完了しました。
この例では、TaskStatus
というenum
を定義し、タスクの状態を管理しています。
初期値をNotStarted
に設定し、タスクの進行状況に応じて状態を変更しています。
printTaskStatus
関数を使用して、現在のタスクの状態を出力することで、プログラムの可読性を高めています。
このように、enum
の初期値を活用することで、状態管理が簡潔かつ明確になります。
まとめ
この記事では、C++におけるenum
の初期値やその変更方法、さらにenum class
との違いについて詳しく解説しました。
enum
を活用することで、プログラムの可読性や保守性が向上し、特に状態管理において非常に便利であることがわかりました。
今後は、実際のプログラムにenum
を取り入れ、より効率的なコードを書くことを目指してみてください。