初期化リスト

読み:しょきかリスト
品詞:名詞

C++で、クラスメンバー変数を初期化する機能。

目次

classの定義で : で区切ると継承の設定となり基底クラスを記述できるが、class定義の中にあるコンストラクタープロトタイプ宣言または定義での引数リストの後を : で区切ると初期化リストとなる。

C++では、コンストラクターでの処理効率を上げるため、メンバー変数の初期化はコンストラクター内の処理ではなく、初期化リストを利用することが推奨されている。

また、初期化リストではメンバー変数の初期化だけでなく、基底クラスの初期化も可能である。

コンストラクターでの初期化

なぜコンストラクターでの初期化が良くないかというと、C++の特徴から、余計な処理が発生してしまうためである。

例えば、次のような処理を考える。

class Dessert {
    std::string name;
public:
    Dessert(const std::string &Name) { name = Name; }
};

少なくとも正常動作はするため一見問題はないように思われるが、このコードは冗長である。なぜなら、次のように動作するためである。

  1. Dessertクラスのインスタンス化を開始する
  2. std::stringを空のコンストラクターで実行し、メンバー変数 name のインスタンスを生成する
  3. Dessertクラスのコンストラクターを実行する
  4. Dessertクラスのコンストラクターで、引数のstd::stringインスタンスをメンバー変数 name に代入(複写)する

4番目のコンストラクター内処理で=演算子を用いた代入(複写)で初期値が書き込まれるので、2番目で自動的に実行されるstd::stringのコンストラクター処理はまるごと無駄になってしまう。

初期化リストの利用

初期化リストを使うと、無駄が生じない。: の後は、newでインスタンス化する場合と同様の記述をする。

class Dessert {
    std::string name;
public:
    Dessert(const std::string &Name) : name(Name) {}
};
  1. Dessertクラスのインスタンス化を開始する
  2. 初期化リストの定義を実行する
  3. Dessertクラスのコンストラクターを実行する

引数がない場合でも、初期化リストを使うことができる。

class Dessert {
    std::string Name;
public:
    Dessert() : Name() {}
};

基底クラスの初期化

初期化リストでは、基底クラスの初期化も可能である。

class Fruit: public Dessert {
    int price;
public:
    Fruit() : Dessert(), price(0) {}
};

メンバー変数含め、初期化内容が複数ある場合はカンマで区切る。

用語の所属
C++
関連する用語
class
コンストラクター
メンバー変数

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club