轉載:ZJE_ANDY函數
static修飾類中成員,表示類的共享數據this
1.static類成員spa
C++primer裏面說過,static類成員不像普通的類數據成員,static類數據成員獨立於一切類對象處在。static類數據成員是與類關聯的,.net
但不與該類定義的對象有任何關係。即static不會像普通類數據成員同樣每個類對象都有一份,所有類對象是共享一個static類成員的。指針
例如A類對象修改了static成員爲1,那麼B對象對應的static類對象成員的值也會是1。code
注意:static類對象必需要在類外進行初始化對象
1 class Text 2 { 3 public: 4 static int count; 5 }; 6 7 int Text::count=0;//用static成員變量必需要初始化 8 9 int main() 10 { 11 Text t1; 12 cout<<t1.count<<endl; 13 return 0; 14 }//程序輸出0
static修飾的變量先於對象存在,因此static修飾的變量要在類外初始化。由於static是全部對象共享的變量,必需要比對象先存在。blog
1 class Text 2 { 3 public: 4 static int count; 5 }; 6 7 int Text::count=0;//用static成員變量必需要初始化 8 9 int main() 10 { 11 Text t1; 12 Text t2; 13 14 t1.count = 100; //t1對象把static成員count改成100 15 cout<<t2.count<<endl; //當t2對象打印static成員的時候,顯示的是100而不是0 16 return 0; 17 }
好處:內存
用static修飾的成員變量在對象中是不佔內存的,由於他不是跟對象一塊兒在堆或者棧中生成,用static修飾的變量在靜態存儲區生成的。因此用static修飾一方面的好處get
是能夠節省對象的內存空間。如同你建立100個Person對象,而這100個對象都有共有的一個變量,例如叫國籍變量,就是Person對象的國籍都是相同的。
那若是國籍變量用static修飾的話,即便有100個Person對象,也不會建立100個國籍變量,只須要有一個static修飾的國籍變量就能夠了。這100個對象要用的時候,
就會去調用static修飾的國籍變量。不然有100個Person變量,就會建立100個國籍變量,在國籍變量都是相同的狀況下,就等於浪費空間了。
2.static類成員函數
因爲static修飾的類成員屬於類,不屬於對象,所以static類成員函數是沒有this指針的,this指針是指向本對象的指針。正由於沒有this指針,因此static類成員函數
不能訪問非static的類成員,只能訪問 static修飾的類成員。
1 class Text 2 { 3 public: 4 static int fun() 5 { 6 return num; 7 } 8 static int count; 9 int num; 10 }; 11 int Text::count=5;//用static成員變量必需要初始化 12 13 int main() 14 { 15 Text t1; 16 Text t2; 17 t1.num=100; 18 19 t1.fun();//發生錯誤,fun函數return的是非static類成員 若是return count就正確 20 return 0; 21 }