Prasoon はすでにあなたに非常に良い答えを出しています。ただし、コメントにまとめることができなかった追加の点を指摘したいと思います。
すべての型がプリミティブまたは参照のいずれかである言語 (Java、C#) から来た C++ 初心者によって、この間違い (初期化リストの無視) が多く行われるのを見てきました。null
複雑な型への参照をデフォルトで初期化し、後で実際のオブジェクトで上書きすることは大したことではありません。ただし、C++ では、参照セマンティックが明示的に選択 (および実装) されない限り、型は値セマンティックを持ちます。
T
初期化にコストがかかるタイプだと考えてください。(「高価な」の定義について。そのような型を想像するのが難しい場合は、グラフィック カード ドライバーのコードについて話していると想像してみてください。そのようなコードでは、ほとんどすべてのものが高価です。)コンストラクターの本体は、コンストラクターの本体が実行されるときに既に構築されている必要があります。そうしないと、有効なオブジェクトではなく生のメモリにアクセスすることになります。(構築とは、生のメモリの塊を有効なオブジェクトに変えるものです。)
したがって、コンストラクターの本体でオブジェクトに何かを割り当てると、既に完全に構築されたオブジェクトに割り当てられます。コンストラクターを指定しなかったため、オブジェクトはデフォルトのコンストラクターを使用して構築されます。これは、オブジェクトが最初にデフォルトで構築され、次の瞬間にデフォルト値が別のもので上書きされることを意味します。
それは確かにナンセンスです。それが、初期化リストがある理由です。それらを使用して、基本クラスとメンバーのサブオブジェクトを構築するために使用する必要があるコンストラクターをコンパイラーに指定できます。このようにして、オブジェクトは正しい値ですぐに作成されます。
また、ご存じのように、初期化リストは特定のデータ メンバー、つまり定数オブジェクト、参照、およびアクセス可能な既定のコンストラクターを持たない型のオブジェクトを初期化する唯一の方法です。