0Pricing
C++ Academy · レッスン

コンストラクターとメンバー初期化子リスト

メンバー初期化子リストを使って、メンバーを適切に初期化します。

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

コンストラクターとは

コンストラクターは、オブジェクトの作成時に実行される特殊なメソッドです。クラスと同じ名前を持ち、戻り値の型はありません。

class Point {
public:
    Point() {              // default constructor
        x_ = 0;
        y_ = 0;
    }
private:
    int x_, y_;
};

パラメーター付きコンストラクター

コンストラクターはパラメーターを受け取ることができ、複数のオーバーロードを定義できます。

class Point {
    int x_, y_;
public:
    Point() : x_(0), y_(0) {}
    Point(int x, int y) : x_(x), y_(y) {}
};

メンバー初期化子リスト

本体の前にある : member(value) という構文は、メンバー初期化子リストです。メンバーはここで初期化され、本体の中で後から代入されるわけではありません。

class Person {
    std::string name_;
    int age_;
public:
    Person(std::string n, int a) : name_(std::move(n)), age_(a) {}
};

初期化子リストを使う理由

メンバーは適切な値で一度だけ構築されます。初期化子リストを使わない場合、メンバーはデフォルト構築された後で代入されるため、非自明な型では無駄が生じます。

初期化の順序

メンバーは、初期化子リストの順序ではなく、クラス内で宣言されている順序で初期化されます。混乱を避けるため、順序をそろえてください。

クラス内デフォルト初期化子(C++11)

クラス本体でメンバーに直接デフォルト値を指定できます。ほとんどのコンストラクターで同じデフォルト値を使う場合に便利です。

class Buffer {
    size_t size_ = 0;
    char* data_ = nullptr;
public:
    Buffer() = default;
    Buffer(size_t n) : size_(n), data_(new char[n]) {}
};

= default と = delete

特殊メンバー関数をコンパイラーに生成させたり、削除させたりできます。

class Widget {
public:
    Widget() = default;          // compiler-generated default
    Widget(const Widget&) = delete;  // disable copy
};

委譲コンストラクター(C++11)

コンストラクターから同じクラスの別のコンストラクターを呼び出して、初期化処理を共有できます。

class Box {
    int w_, h_, d_;
public:
    Box(int w, int h, int d) : w_(w), h_(h), d_(d) {}
    Box() : Box(1, 1, 1) {}      // delegates to the 3-arg ctor
};

explicit コンストラクター

単一引数のコンストラクターは暗黙の型変換に使われることがあります。予期しない変換を防ぐには、explicit を付けてください。

class Vector {
public:
    explicit Vector(size_t n);
};
Vector v = 10;          // ERROR: explicit prevents this
Vector v(10);            // OK

デストラクター

デストラクター ~ClassName() は、オブジェクトが破棄されるときに実行されます。ファイル、ソケット、 raw メモリなどのリソースを解放するために使用します。

Rule of Five(先取り)

特殊メンバー関数(デストラクター、コピーコンストラクター、コピー代入、ムーブコンストラクター、ムーブ代入)のいずれかを自分で記述する場合は、5つすべてについて検討してください。詳しくはムーブセマンティクスのコースで扱います。

クイックチェック

クラスのメンバーが初期化される順序は、何によって決まりますか。

まとめ

コンストラクターを使ってオブジェクトの状態を設定してください。本体内での代入よりも、メンバー初期化子リストを優先してください。単一引数のコンストラクターには explicit を付け、= default / = delete を使って意図を明確にしてください。

よくある質問

「コンストラクターとメンバー初期化子リスト」レッスンは無料ですか?

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

「コンストラクターとメンバー初期化子リスト」で何を学びますか?

メンバー初期化子リストを使って、メンバーを適切に初期化します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「コンストラクターとメンバー初期化子リスト」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. structとclassの使い分け
  2. メンバー変数とメソッド
  3. コンストラクターとメンバー初期化子リスト
  4. thisポインターとカプセル化
← C++ Academyに戻る