C++コンストラクタ初期化リスト:なぜ使うのか、どう使うのか
オブジェクトをインスタンス化する際、コンストラクタはメンバ変数の初期化を担当することが多いです。こうしたメンバに対して、コンストラクタの初期化リストを使用すると、コンストラクタの本体が実行される前に、メンバ変数を直接かつ効率的に初期化できます。パフォーマンス面でのメリットに加え、const変数や基底クラスのメンバの場合は必須となります。
コンストラクタ初期化リストとは
コンストラクタ初期化リストは、メンバ変数を直接初期化する手法であり、デフォルトコンストラクタによる初期化に続いて代入が行われるのを防ぎます。
構文
コンストラクタ初期化リストの構文は以下の通りです:
ClassName(type1 param1, type2 param2) : member1(param1), member2(param2) { // コンストラクタ本体 }
ここで、member1とmember2は、コンストラクタ本体が実行される前にparam1とparam2で初期化されます。
コンストラクタ初期化リストの例
初期化リストの使用方法を示すシンプルな例です。
#include <iostream> #include <string> class Student { public: Student(const std::string& name, int age) : name(name), age(age) {} void display() const { std::cout << "Name: " << name << ", Age: " << age << "\n"; } private: std::string name; int age; }; int main() { Student s("Navya", 20); s.display(); return 0; }
出力
Name: Navya, Age: 20
なぜコンストラクタ初期化リストを使うのか?
- デフォルト初期化に続く再代入を避け、時間とリソースを節約。
- const変数、参照メンバ、基底クラスメンバの場合は必須。
- すべての初期化ロジックを1か所にまとめ、コンストラクタ本体から分離できる。
特殊なケース
以下にコンストラクタ初期化リストの特殊なケースをいくつか示します:
constまたは参照メンバ
const変数と参照メンバは再代入できないため、初期化リストで初期化する必要があります。
class Config { public: Config(const std::string& product, const int & model) : product (product), model(model) {} private: const std::string product; const int & model; };
基底クラスの初期化
派生クラスが基底クラスから継承する場合、初期化リストを使用して基底クラスのコンストラクタを呼び出せます。
class Base { public: Base(int value) : baseValue(value) {} protected: int baseValue; }; class Derived : public Base { public: Derived(int value, int extra) : Base(value), extraValue(extra) {} private: int extraValue; };
C言語
- C# 部分クラスと部分メソッドを理解する
- C++コメントの完全マスター:ベストプラクティスと構文
- C++インターフェース完全理解:抽象クラスと純粋仮想関数
- C言語 演算子の優先順位と結合規則:完全ガイド
- C++データ型修飾子を理解する:signed, unsigned, long, short
- C++文字列完全マスター:Cスタイル文字列 vs std::string
- C言語のストレージクラス:スコープ、ライフタイム、使い分け
- C言語定数ポインタとconstポインタ完全マスター
- C++構造体を実例で徹底解説
- C++動的配列の確保をマスター:コード例付き実践ガイド
- C# usingステートメント完全ガイド:名前空間インポート、エイリアス、静的ディレクティブ