2017-06-21 11 views
0

私はCPPの初心者だと以下のように理解できませんでした:struct内でconst static変数を初期化する必要があるのはなぜですか?

ここ
struct A{ 
int i; 
static int j; 
} 

int A::j = 20; 

、 を静的varibleがA内で初期化することができない理由を私は理解し、それがスコープ解決を使用してAのoutisedを初期化する必要があります。 (つまり、jのポイントメモリが割り当てられ、値が初期化されます)、jは、静的変数であり、すべてのオブジェクトに対して静的な記憶域を持つため、ここではsizeof(A)に追加されません。私が直接、構造体宣言にbの値を初期化することを余儀なくしています。ここ

struct B{ 
int a; 
const static int b = 20; 
} 

、 :

は、次のスクリプトを考えてみましょう。静的変数がconstタイプの場合、これはなぜそうですか? この変数をBの範囲外に定義しようとすると、前の宣言がbであることを示すコンパイラー・エラーがスローされます。ここでbのメモリが実際に割り当てられ、なぜそれが宣言内で初期化されなければならないのですか?通常の静的変数のように::演算子を使用して初期化できないのはなぜですか?

+4

宣言では、 'b'の値を強制的に初期化する必要はありません。 'const int B :: b = 20;'はうまく動作します。あなたの 'struct'宣言の最後に'; 'を追加するのを忘れたと思います。 –

+2

'B'の外側で' b'を初期化しようとするとどうなりますか?コンパイラエラーが出ますか?エラーは何ですか? –

+0

@FrançoisAndrieux静的変数が 'const static'型である場合、なぜ通常の 'static'変数とは違って変数の値を与えることができますか? – Mbeginner

答えて

2

エラーを誤解しました。エラーは、 "と矛盾する宣言"のようなものでなければなりません。つまり、インラインconstを宣言していても、その定義にconstはありません。したがって、これを行うだけです:

const int B::b = 20; 
関連する問題