C プログラミングでは、初期化リストで初期化されていないメンバー変数がクラス定義にある場合、コンパイラは「クラス メンバーは初期化リストで初期化する必要があります」というエラーを報告します。これは、オブジェクトの作成時にこのメンバー変数のコンストラクターが呼び出されず、プログラムが不安定になる可能性があることを意味します。
したがって、C では、クラスのオブジェクトを作成するときは、可能な限り初期化リストを使用する必要があります。この記事では、初期化リストとは何か、その使い方と、初期化リストでクラスのメンバーが初期化されていないエラーの解決方法を紹介します。
初期化リストとは何ですか?
C では、クラスのメンバーは基本的なデータ型、配列、構造体、クラスなどになります。クラスでメンバー変数を定義する場合、コンストラクター本体で初期化するか、初期化リスト (コンストラクター初期化リスト) を使用するかを選択できます。
初期化リストはコンストラクターの関数ヘッダーです。初期化リストを使用して、コンストラクターの前にメンバーを初期化できます。これは、コンストラクター本体の前のコロン (:) の後にカンマで区切られた一連の初期化操作です。初期化リストでは、複数のメンバー変数を同時に初期化することも、初期化にデフォルトのコンストラクターを使用することもできるため、初期化リストでクラス・メンバーが初期化されていないことによって発生するエラーを回避できます。
構文は次のとおりです:
class SomeClass { public: SomeClass(int a, int b, int c) : var1(a), var2(b), var3(c) { //构造函数体中的其它操作 } private: int var1; int var2; int var3; };
この例では、SomeClass には var1、var2、var3 の 3 つのメンバー変数があります。これらはコンストラクターの前に初期化され、コンストラクター本体で他の操作が行われます。リストを初期化した後に実行されます。
初期化リストの使用法
クラス内にクラス メンバーとして他のオブジェクトがある場合は、初期化リストを使用することもできます。リストを使用してこれらのメンバーを初期化します。以下に示すように:
class Person { public: Person(int _age, int _id) : age(_age), id(_id), car("BMW", "blue") { } private: int age; int id; Car car; //Car 是一个类类型成员 };
この例では、初期化リストを使用してメンバー変数 age、id、car を初期化します。このうち、car は person クラスのメンバ変数で、Car 型のオブジェクトであり、「Car car」で宣言されています。 Person オブジェクトを作成するときは、car メンバーも初期化する必要があります。初期化リストを使用する場合は、Car クラスのコンストラクターを使用してオブジェクトを初期化する必要があります。
ある型を別の型に変換する必要がある場合は、初期化リストを使用できます。
class A { public: A(int val) : a(val), b(val*1.2), c(val*1.5) {} private: int a; double b; float c; };
In この例では、たとえば、初期化には int 型の値が使用され、初期化リスト内で型変換も実行できます。
クラス内のメンバー変数を読み取り専用にする必要があり、初期化できるのはオブジェクトの作成時ではなく、作成時のみである場合があります。構築 関数本体内の変更。これは、初期化リストを使用して実現できます。以下に示すように:
class B { public: B() : a(5), b(2), c(a*b) {} private: const int a; const int b; const int c; };
この例では、変数 a、b、および c はすべて読み取り専用であり、オブジェクトの作成時にすべて初期化する必要があります。 c は a と b の積であり、a と b は両方とも読み取り専用であるため、初期化リスト内でのみ操作でき、それに割り当てられた式をコンストラクター本体で変更することはできません。
「クラスメンバーは初期化リストで初期化する必要があります」というエラーに対処するにはどうすればよいですか?
クラスのオブジェクトの作成時にクラス メンバーが初期化リストで初期化されていない場合、コンパイラは「クラス メンバーは初期化リストで初期化する必要があります」というエラーを報告します。このエラーを回避するには、次の手順に従います。
コンパイラでは、初期化リスト内でどのメンバー変数が初期化されていないのかがエラー メッセージに示されます。次のようなプロンプトに従って、ソース コード内の対応するメンバー変数を見つけることができます。
class Test { public: Test() { int a = 0; std::string b; } };
Test クラスには、2 つのメンバー変数 a と b があります。クラスのコンストラクターで、初期化リストで初期化を行っていないため、エラーが報告されました。
必要に応じて、初期化されていないメンバー変数をコンストラクターの初期化リストに追加します。コンストラクターのコードを次のように変更します。
class Test { public: Test() : a(0), b("") {} private: int a; std::string b; };
この例では、初期化リストを使用してメンバー変数 a と b を初期化することで、「クラス メンバーは初期化リストで初期化する必要があります」というエラーを回避します。
注意事項
C では、初期化リストを使用すると、クラス メンバーが初期化リストで初期化されていない場合のエラーを回避できるだけでなく、プログラムの効率も向上します。コンストラクター本体で初期化が必要な場合、コンストラクターの最後でクラスメンバーのコンストラクターが複数回呼び出される可能性がありますが、初期化リストを使用すると呼び出されるのは1回だけで済むため、プログラムの効率が向上します。
また、メンバ変数が const 型の場合、初期化リストで初期化されていない場合、コンパイラはエラーを報告します。初期化リストを使用する場合は、メンバー変数の型とその初期化方法に注意する必要があります。
以上がC++ エラー: クラス メンバーは初期化リストで初期化する必要があります。どのように対処すればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。