2012-03-13 115 views
0

一個類的靜態成員變量和類的「主體」中定義的「自由」變量之間的區別是什麼?我的意思是我可以用第二個來代替第一個排出班級的頭部嗎?從標題中刪除靜態成員

// b.h 
class B 
{ 
public: 
    B(int j); 
    void print(); 
private: 
    static int is; 
}; 


//b.cpp 
#include <iostream> 

int i = 0; 
int B::is = 0; 

B::B(int j) 
{ 
    i = j; 
    is = j; 
} 

void B::print(){ 
    std::cout << i << " " << is << " " << std::endl; 
} 

//main.cpp 
int main() { 
    B b1(1); 
    b1.print(); 
    B b2(2); 
    b2.print(); 
    b1.print(); 
    return 0; 
} 

輸出:

1 1 
2 2 
2 2 

回答

2

在你的情況,所不同的是在靜止構件的數據可以由類只訪問,因爲它是在類的private部分聲明,其可以在某些情況下是可取的。任何人都可以更改全球i

因此,如果一個變量僅適用於該類,並且不應該被其他人使用,那麼在private部分中使用靜態成員數據是更好的解決方案。它使您能夠對變量進行受限訪問。全局變量通常是不好的,因爲它可以不受限制地訪問任何人。

請注意,在你的情況下,全局變量i外部聯動。在其他文件中,可以簡單地聲明爲extern int i,然後可以使用i修改

即使你把它static全局變量,以使其具有內部聯動,它比static成員數據並不好,因爲靜態數據成員爲您提供了某種想法,該變量使用只有類,而不是非類成員(如果在同一個文件中)。因此與全球static數據相比,static成員數據提高了可讀性。

+0

它有b.cpp的文件範圍,誰可以改變它,以及如何? – 2012-03-13 18:13:16

+0

@DmitryKachko:從其他文件中,可以使用全局變量,因爲在你的情況下它有'external'鏈接。在其他文件中,可以簡單地聲明爲'extern int i',然後可以使用(和*修改*)變量。 – Nawaz 2012-03-13 18:15:47

+0

全局變量是不好的,因爲命名空間衝突的原因,當然我可以把它放在一個命名空間,它只是一個簡單的例子,它不是問題的問題。 – 2012-03-13 18:17:59