コンストラクタ初期化リスト
メニューを表示するにはスワイプしてください
初期化リストは、コンストラクタ本体が実行される前にクラスメンバーを初期化するための仕組み。特に複雑な初期化や、constメンバーを持つクラスのオブジェクトを扱う場合に有用。
初期化リストの構文
初期化リストの構文は一見複雑で分かりにくい場合がある。単純な代替手段としてコンストラクタのみを使うことも考えられるが、プログラムが拡張されるにつれて、初期化リストは便利で扱いやすい方法となる。
-
:(コロン記号): コンストラクタ内でメンバー初期化リストを導入する記号; -
member (value): クラスメンバー変数が、コンストラクタに渡された値(引数)で初期化される;
-
{ }(波括弧): コンストラクタ本体。メンバー初期化後に追加の処理を記述可能。
temperature_sensor.h
1234567class TemperatureSensor { public: TemperatureSensor(int initialTemperature) : currentTemperature(initialTemperature) {} int currentTemperature; };
制限事項と考慮点
初期化リストにおける初期化順序について、一般的な誤解があります。多くの人が考えているのとは異なり、初期化リストで変数を記述した順番で初期化が行われるわけではありません。実際には、初期化リストの記述順ではなく、クラス内でのメンバー宣言順によって決まります。
main.cpp
123456789101112131415#include <iostream> class Exchanger { public: Exchanger(float _quantity, float _rate) : quantity(_quantity), rate(_rate), total(quantity * rate) {} float quantity, rate, total; }; int main() { Exchanger exchanger(100, 0.3); std::cout << exchanger.total; }
初期化リスト内およびtotal内での変数宣言時に、class変数の初期化順序を変更してみてください。
コンストラクタで初期化リストを使用する場合、引数名はclassの属性名と同じにすることができます。
main.cpp
123456789101112131415#include <iostream> class Exchanger { public: Exchanger(float quantity, float rate) : quantity(quantity), rate(rate), total(quantity * rate) {} float quantity, rate, total; }; int main() { Exchanger exchanger(100, 0.3); std::cout << exchanger.total; }
しかし、メンバ変数と引数の両方に同じ名前を使用すると、total にはメンバではなく引数を掛け合わせた値が代入されます。これを確認するには、quantity を引数ではなくゼロに設定してみてください。
1. コンストラクタ初期化リストとは何ですか?
2. コンストラクタでメンバ初期化リストを導入する記号はどれですか?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください