2015-05-02 101 views
0
class test { 
public: 
    static int n; 
    test() { n++; }; 
    ~test() { n--; }; 
}; 

int test::n=0; //<----what is this step called? how can a class be declared as an integer? 

int main() { 
    test a; 
    test b[5]; // I'm not sure what is going on here..is it an array? 
    test * c = new test; 
    cout << a.n << endl; 
    delete c; 
    cout << test::n << endl; 
} 

其次,輸出是7,6我不明白它是如何得到7,從哪裏?申報類整數

+0

https://www.google.com/search?q=c%2B%2B+static+member+initialization&ie=utf-8&oe=utf-8&aq=t&rls=Palemoon:en-US&client=palemoon – user3528438

回答

2

從陳述書

int test::n=0; 

'::' 被稱爲範圍解析操作符。此運算符用於初始化靜態字段n,而不是類

1

靜態數據成員在類中聲明。它們在課堂外定義。

類定義因此

class test { 

public: 
static int n; 
test() { n++; }; 
~test() { n--; }; 
}; 

記錄

static int n; 

只宣佈ñ。你需要定義它來爲它分配內存。 這

int test::n=0; 

是它的定義。 test::n是變量的限定名稱,表示n屬於類測試。

根據類定義時構造一個類的對象此靜態變量增加

test() { n++; }; 

而當物體被破壞此靜態變量被降低

~test() { n--; }; 

事實上這靜態變量起着計算類的活動對象的作用。

因此,在主所定義的類的對象,具有名稱的

test a; 

一個對象被定義的類的構造函數被調用每次。因此n爲增加並變爲等於1 Adter限定5個對象

test b[5]; 

n個陣列變得等於6.

動態分配一個多個對象

test * c = new test; 

n中等於後到7.

其明確刪除後

delete c; 

n再次變成等於6,因爲調用析構函數減少n。