初期化リスト |
辞書:電算用語の基礎知識 プログラミング仕様編 (PTPROGS) |
読み:しょきかリスト |
品詞:名詞 |
|
概要 |
classの定義で : で区切ると継承の設定となり基底クラスを記述できるが、class定義の中にあるコンストラクターのプロトタイプ宣言または定義での引数リストの後を : で区切ると初期化リストとなる。
C++では、コンストラクターでの処理効率を上げるため、メンバー変数の初期化はコンストラクター内の処理ではなく、初期化リストを利用することが推奨されている。
また、初期化リストではメンバー変数の初期化だけでなく、基底クラスの初期化も可能である。
特徴 |
コンストラクターでの初期化 |
なぜコンストラクターでの初期化が良くないかというと、C++の特徴から、余計な処理が発生してしまうためである。
例えば、次のような処理を考える。
class Dessert { std::string name; public: Dessert(const std::string &Name) { name = Name; } };
少なくとも正常動作はするため一見問題はないように思われるが、このコードは冗長である。なぜなら、次のように動作するためである。
4番目のコンストラクター内処理で=演算子を用いた代入(複写)で初期値が書き込まれるので、2番目で自動的に実行されるstd::stringのコンストラクター処理はまるごと無駄になってしまう。
初期化リストの利用 |
初期化リストを使うと、無駄が生じない。: の後は、newでインスタンス化する場合と同様の記述をする。
class Dessert { std::string name; public: Dessert(const std::string &Name) : name(Name) {} };
引数がない場合でも、初期化リストを使うことができる。
class Dessert { std::string Name; public: Dessert() : Name() {} };
基底クラスの初期化 |
初期化リストでは、基底クラスの初期化も可能である。
class Fruit: public Dessert { int price; public: Fruit() : Dessert(), price(0) {} };
メンバー変数含め、初期化内容が複数ある場合はカンマで区切る。
リンク |
通信用語の基礎知識検索システム WDIC Explorer Ver 7.04a (27-May-2022) Search System : Copyright © Mirai corporation Dictionary : Copyright © WDIC Creators club |