2011-05-24 14 views
6

クラス内で初期化されていても、static constメンバをクラス定義外に定義する必要がありますか? // const int abc::period;をコメントした後クラス定義外の静的constの定義

#include<iostream> 
using namespace std; 
class abc 
{ 
    static const int period=5; 
    int arr[period]; 
    public: 
    void display() 
    { 
     cout<<period<<endl; 
    } 
}; 

const int abc::period; 

int main() 
{ 
    abc a; 
    a.display(); 
    return 0; 
} 

は、コードの両方のバージョンは、GCC 4.3.4で問題なく動作します。だから私はなぜ両方のバージョンが動作し、どちらが標準に準拠しているのか尋ねたいのですが?

答えて

8

const int abc::period;と書いて、の静的メンバーを定義しています。 static constクラスのクラス初期化子を提供することは許されていますが、これは定義ではありませんが、それは単なる宣言です。

9.4.2/4 - 静的データメンバがconst整数型またはconst列挙型である場合、クラス定義の宣言では整数定数式(5.19)である定数初期化子を指定できます。その場合、メンバは整数定数式で表示できます。メンバは、プログラム内で使用され、名前空間のスコープ定義にイニシャライザが含まれていない場合、名前空間のスコープ内で定義されなければならない。

静的メンバーのアドレスを取得していないため、コードが定義されていなくてもコンパイルされます。 Bjarne StroustrupはC++で言及しています - よくある質問hereクラス外の定義を持つ場合は、静的メンバーのアドレスを取ることができます。

+0

+1いいですね。 – Mahesh

+0

+詳細な説明のために – Ernie

+0

この質問(確かに重複しています)では、直感的ではないので、§9.4.2/ 4の文脈で**使用されていることを意味するのは興味深いと思いますそうでなければ定義は必要ではない。最初の部分は、アドレス*を取っていないため*に何らかの形で記載されていますが、ほとんどの人がそれが*使用された用語の近似であることを認識するかどうかはわかりません。 –

関連する問題