7

C++ でクラスの非静的 const データ メンバーを定義するにはどうすればよいですか? 次のコードをコンパイルしようとすると:

class a
{
public:
    void print()
    {
        cout<<y<<endl;
    }
private:
    const int y=2;
};

int main()
{
    a obj;
    obj.print();
}

エラーが発生する

ISO C++ forbids initialization of member ‘y’
4

3 に答える 3

27

C++03 では、コンストラクターでメンバー初期化リストconstを使用して、クラスのフィールドを初期化できます。例えば:

class a
{
public:
    a();

    void print()
    {
        cout<<y<<endl;
    }

private:
    const int y;
};

a::a() : y(2)
{
    // Empty
}

コンストラクターの後の構文に注意してください: y(2)。これは、値 2 を持つようにフィールドを初期化するように C++ に指示しyます。より一般的には、この構文を使用して、クラスの任意のメンバーを任意の値に初期化できます。クラスにconstデータ メンバーまたは参照であるデータ メンバーが含まれている場合、これがそれらを正しく初期化する唯一の方法です。

C++11 では、この制限が緩和され、クラスの本体でクラス メンバーに値を割り当てても問題ないことに注意してください。言い換えれば、元のコードをコンパイルするのに数年待てば、問題なくコンパイルできるはずです。:-)

于 2011-07-31T19:28:32.347 に答える
6

コンストラクターの初期化リストで初期化します。

class a
{
  const int y;
public:
  a() : y(2) { }
};
于 2011-07-31T19:26:56.330 に答える
4

クラス定義内で初期化子を使用することはできません。代わりにコンストラクターの初期化を使用する必要があります。

a::a() : y(2) {}
于 2011-07-31T19:27:15.940 に答える