歴史的背景:
初期のC++バージョンでは、クラスのすべてのメンバーはコンストラクタの初期化リストまたはコンストラクタの本体内で初期化する必要がありました。C++11の登場により、非静的メンバーをその定義の場所で直接初期化できるようになり、これは読みやすさを大幅に改善し、初期化されていない変数によるエラーの可能性を低減しました。
問題点:
デフォルト初期化の欠如は、特に新しいコンストラクタが追加されたときに開発者にとって非明示的な動作を引き起こす可能性があります。クラスメンバーが常に初期化される保証はありませんでした。このアプローチの美しさと新しさは、ボイラープレートコードを減少させることにあります。
解決策:
インライン初期化は、コンストラクタの初期化リストで明示的に初期化されていない場合、クラスのメンバーにデフォルト値を設定します。
コード例:
class Widget { int value = 42; std::string name{"default"}; public: Widget() {} Widget(int v) : value(v) {} };
主な特徴:
コンストラクタの初期化リストでメンバーが指定されている場合、インライン初期化の値は使用されますか?
いいえ、コンストラクタの初期化リストからの値が使用されます。例:
class Test { int a = 10; public: Test(int x) : a(x) {} }; Test t(42); // a == 42
クラスの静的メンバーをインライン初期化できますか?
いいえ、静的ではなく非静的なメンバーのみです。静的メンバーはクラスの外で別々に初期化されます。
インラインでクラスメンバーの初期化に式を使用できますか?
簡単なメンバーにははい(例えば、コンストラクタの呼び出しやリテラルなど)。複雑な計算が必要な場合は、関数を使用するか、コンストラクタ内で初期化を行います。
チームは新しいコンストラクタを追加しましたが、フィールドの初期化を忘れてしまいました。未初期化の値のまま残り、変数へのアクセス時にクラッシュが発生しました。
利点:
欠点:
クラスのすべてのフィールドにインライン初期化を適用しました。新しいコンストラクタでは、初期化を明示的に記述する必要がなくなり、ボイラープレートコードとエラーの数が減りました。
利点:
欠点: