コンストラクターとメンバー初期化子リスト
メンバー初期化子リストを使って、メンバーを適切に初期化します。
「コンストラクターとメンバー初期化子リスト」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- structとclassの使い分け
- メンバー変数とメソッド
- コンストラクターとメンバー初期化子リスト
- thisポインターとカプセル化