0Pricing
C++ Academy · レッスン

範囲ベースfor、nullptr、enum class

C++11の便利な機能である範囲ベースfor、nullptr、強い型付けの列挙型を使います。

「範囲ベースfor、nullptr、enum class」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

C++11で得られる3つの手軽な改善

C++11では、多くの小さな改善が導入されました。毎日のように使うことになるのは、range-based for、nullptr、enum classの3つです。

range-based forのまとめ

begin()とend()を持つコンテナであれば、インデックス計算なしで反復処理できます。

for (const auto& x : v) {
    process(x);
}

何に置き換わるか

冗長なイテレーターによるループを、1行で書けるようになります。

// Before C++11
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
    process(*it);
}

nullptrはNULLより優れています

nullptrは型付きのヌルポインターリテラルです。0のマクロであるNULLで発生する、オーバーロード解決の曖昧さを避けられます。

void f(int);
void f(int*);

f(NULL);      // calls f(int)
f(nullptr);   // calls f(int*)

nullptrを使う理由

一貫してnullptrを使ってください。

  • 独自の型(std::nullptr_t)を持つ
  • 意図が明確になる
  • テンプレートメタプログラミングで使える
  • 誤ってintに変換されない

通常のenumは危険です

古い形式のenumは、名前を外側のスコープに漏らし、暗黙的にintへ変換されます。

enum Color { RED, GREEN, BLUE };
int c = RED;            // implicit conversion, no warning
// RED, GREEN, BLUE leak into global scope

enum class:スコープ付きで型安全

C++11のenum classでは修飾が必要になり、intへの暗黙的な変換も禁止されます。

enum class Color { Red, Green, Blue };
Color c = Color::Red;
// int n = Color::Red;     // ERROR
std::cout << static_cast<int>(c);   // explicit conversion

基底型の指定

enum classの記憶領域サイズを、特定の整数型に固定できます。

enum class Status : uint8_t { OK = 0, FAIL = 1, RETRY = 2 };

enum classの前方宣言

基底型が分かっているため、enum classは前方宣言できます。ヘッダーのインクルードを分割する際に便利です。

// header A
enum class Color : int;

// header B (full definition)
enum class Color : int { Red, Green, Blue };

通常のenumを使ってもよい場合

通常のenumにも用途はあります。暗黙的な変換を本当に必要とする整数フラグのビットマスクなどです。その設計上の選択を明確に文書化してください。

移行のヒント

コードベースを現代化するときは、通常のenumからenum classへの変換を段階的に行ってください。暗黙的なint変換に依存している箇所を検索し、static_castを追加します。

クイックチェック

enum classが通常のenumより安全なのはなぜですか。

まとめ

C++11で得られる3つの手軽な改善は、range-based forによるイテレーター記述の削減、NULLのnullptrへの置き換え、スコープ付きで型安全なenumを提供するenum classです。基本的にこの3つを使ってください。

よくある質問

「範囲ベースfor、nullptr、enum class」レッスンは無料ですか?

はい。「範囲ベースfor、nullptr、enum class」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「範囲ベースfor、nullptr、enum class」で何を学びますか?

C++11の便利な機能である範囲ベースfor、nullptr、強い型付けの列挙型を使います。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「範囲ベースfor、nullptr、enum class」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. auto、decltype、型推論
  2. 範囲ベースfor、nullptr、enum class
  3. ラムダ式:キャプチャ、mutable、ジェネリック
  4. 構造化束縛とif-init(C++17)
← C++ Academyに戻る