ホームページ  >  記事  >  バックエンド開発  >  C++ エラー: クラス メンバーは初期化リストで初期化する必要があります。どのように対処すればよいですか?

C++ エラー: クラス メンバーは初期化リストで初期化する必要があります。どのように対処すればよいですか?

WBOY
WBOYオリジナル
2023-08-21 22:24:221113ブラウズ

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 つのメンバー変数があります。これらはコンストラクターの前に初期化され、コンストラクター本体で他の操作が行われます。リストを初期化した後に実行されます。

初期化リストの使用法

  1. オブジェクト メンバーの初期化

クラス内にクラス メンバーとして他のオブジェクトがある場合は、初期化リストを使用することもできます。リストを使用してこれらのメンバーを初期化します。以下に示すように:

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 クラスのコンストラクターを使用してオブジェクトを初期化する必要があります。

  1. 型変換の初期化

ある型を別の型に変換する必要がある場合は、初期化リストを使用できます。

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 型の値が使用され、初期化リスト内で型変換も実行できます。

  1. 読み取り専用メンバーの初期化

クラス内のメンバー変数を読み取り専用にする必要があり、初期化できるのはオブジェクトの作成時ではなく、作成時のみである場合があります。構築 関数本体内の変更。これは、初期化リストを使用して実現できます。以下に示すように:

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 は両方とも読み取り専用であるため、初期化リスト内でのみ操作でき、それに割り当てられた式をコンストラクター本体で変更することはできません。

「クラスメンバーは初期化リストで初期化する必要があります」というエラーに対処するにはどうすればよいですか?

クラスのオブジェクトの作成時にクラス メンバーが初期化リストで初期化されていない場合、コンパイラは「クラス メンバーは初期化リストで初期化する必要があります」というエラーを報告します。このエラーを回避するには、次の手順に従います。

  1. 初期化されていないメンバー変数を確認します。

コンパイラでは、初期化リスト内でどのメンバー変数が初期化されていないのかがエラー メッセージに示されます。次のようなプロンプトに従って、ソース コード内の対応するメンバー変数を見つけることができます。

class Test {
public:
    Test() {
        int a = 0;
        std::string b;
    }
};

Test クラスには、2 つのメンバー変数 a と b があります。クラスのコンストラクターで、初期化リストで初期化を行っていないため、エラーが報告されました。

  1. メンバー変数を初期化リストに追加します。

必要に応じて、初期化されていないメンバー変数をコンストラクターの初期化リストに追加します。コンストラクターのコードを次のように変更します。

class Test {
public:
    Test() : a(0), b("") {}
private:
    int a;
    std::string b;
};

この例では、初期化リストを使用してメンバー変数 a と b を初期化することで、「クラス メンバーは初期化リストで初期化する必要があります」というエラーを回避します。

注意事項

C では、初期化リストを使用すると、クラス メンバーが初期化リストで初期化されていない場合のエラーを回避できるだけでなく、プログラムの効率も向上します。コンストラクター本体で初期化が必要な場合、コンストラクターの最後でクラスメンバーのコンストラクターが複数回呼び出される可能性がありますが、初期化リストを使用すると呼び出されるのは1回だけで済むため、プログラムの効率が向上します。

また、メンバ変数が const 型の場合、初期化リストで初期化されていない場合、コンパイラはエラーを報告します。初期化リストを使用する場合は、メンバー変数の型とその初期化方法に注意する必要があります。

以上がC++ エラー: クラス メンバーは初期化リストで初期化する必要があります。どのように対処すればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。