132
#include <iostream>

using namespace std;
class T1
{
  const int t = 100;
  public:

  T1()
  {

    cout << "T1 constructor: " << t << endl;
  }
};

const メンバー変数tを 100 で初期化しようとすると、次のエラーが表示されます。

test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static

値を初期化するにはどうすればよいconstですか?

4

11 に答える 11

141

variableはconst、変数が変更可能かどうかを指定します。割り当てられた定数値は、変数が参照されるたびに使用されます。割り当てられた値は、プログラムの実行中に変更できません。

Bjarne Stroustrup の説明は、それを簡単に要約しています。

通常、クラスはヘッダー ファイルで宣言され、ヘッダー ファイルは通常、多くの翻訳単位に含まれます。ただし、複雑なリンカ ルールを回避するために、C++ ではすべてのオブジェクトに一意の定義が必要です。オブジェクトとしてメモリに格納する必要があるエンティティのクラス内定義が C++ で許可されている場合、このルールは破られます。

変数はクラス内で宣言するconst必要がありますが、定義することはできません。クラス外で const 変数を定義する必要があります。

T1() : t( 100 ){}

ここで、割り当てt = 100は、クラスの初期化が発生するずっと前に、イニシャライザ リストで発生します。

于 2013-01-24T07:22:23.787 に答える
61

まあ、あなたはそれを作ることができますstatic

static const int t = 100;

または、メンバー初期化子を使用できます。

T1() : t(100)
{
    // Other constructor stuff here
}
于 2013-01-24T06:56:31.420 に答える
40

クラス内の const メンバーを初期化するには、いくつかの方法があります。

一般的に const メンバーの定義には、変数の初期化も必要です。

1)クラス内で、constを初期化したい場合、構文は次のようになります

static const int a = 10; //at declaration

2)2番目の方法は次のとおりです

class A
{
  static const int a; //declaration
};

const int A::a = 10; //defining the static member outside the class

3) 宣言時に初期化したくない場合は、別の方法としてコンストラクターを使用します。変数は初期化リストで初期化する必要があります (コンストラクターの本体ではありません)。このようにならなければなりません

class A
{
  const int b;
  A(int c) : b(c) {} //const member initialized in initialization list
};
于 2014-06-25T03:56:12.093 に答える
14
  1. C++11 をサポートするようにコンパイラをアップグレードすると、コードは完全に機能します。

  2. コンストラクターで初期化リストを使用します。

    T1() : t( 100 )
    {
    }
    
于 2013-01-24T06:57:29.387 に答える
3

メンバーが配列の場合、通常よりも少し複雑になります。

class C
{
    static const int ARRAY[10];
 public:
    C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};

また

int* a = new int[N];
// fill a

class C {
  const std::vector<int> v;
public:
  C():v(a, a+N) {}
};
于 2016-10-01T04:35:14.953 に答える
2

別の可能な方法は、名前空間です。

#include <iostream>

namespace mySpace {
   static const int T = 100; 
}

using namespace std;

class T1
{
   public:
   T1()
   {
       cout << "T1 constructor: " << mySpace::T << endl;
   }
};

欠点は、ヘッダー ファイルが含まれている場合、他のクラスでも定数を使用できることです。

于 2016-03-12T18:27:14.483 に答える