2012-10-12 183 views
1

如何糾正它,所以我可以在下面的例子顯示由靜態初始化INT

cout<<A::a<<endl; 

像靜態詮釋?

#include <iostream> 
using namespace std; 
class A{ 
    public: 
     static int a = 0; 
}; 

int main() 
{ 
    cout << A::a << endl; 
    return 0; 
} 

回答

5

在類定義,靜態成員只能宣稱爲且未定義。默認情況下,只有定義有初始化,除了對於整數類型的靜態常量聲明可以進行初始化。

程序中的問題是使用了靜態成員(std::cout << A::aodr-use用於非常量靜態成員屬性),但是您沒有定義。您需要通過添加定義在程序中的一個單一的翻譯單元變量:

int A::a = value; 

(注意,因爲靜態成員是常量,你不能提供的類定義內的初始化,所以你需要從類定義聲明刪除= 0。還要注意的是,你可以,如果value == 0跳過= value在初始化,靜態初始化將設置A::a 0任何其他初始化之前)

+2

+1在這個特殊情況下使其在內部const和初始化它將工作。 –

+1

@LuchianGrigore:完全改變語義...... –

5

或者:

class A{ 
    public: 
     static const int a = 0; 
}; 

(常量積分類型可以在類定義內被初始化)

class A{ 
    public: 
     static int a; 
}; 

int A::a = 0; 
+0

在第二個例子,爲什麼我要重新聲明「a」爲int? – Yoda

+0

@RobertKilar以前你剛剛宣佈它,現在你正在定義它。這只是語法。 –

+0

但是輸入NAME ...是聲明 – Yoda