C++static類成員,static類成員函式
0.static修飾類中成員,表示類的共享資料
1.static類成員
在C++primer裡面說過,static類成員不像普通的類資料成員,static類資料成員獨立於一切類物件處在。static類資料成員是與類關聯的,但不與該類定義的物件有任何關係。這句話什麼意思?就是static不會想普通類資料成員一樣每一個類物件都有一份,全部類物件是共享一個static類成員的,例如A類物件修改了static成員為1,那麼B物件對應的static類物件成員的值也會是1.
注意:static類物件必須要在類外進行初始化
如:
static類物件必須要在類外進行初始化
class Text { public: static int count; }; int Text::count=0;//用static成員變數必須要初始化 int main() { Text t1; cout<<t1.count<<endl; return 0; }//程式輸出0
所有物件共享一個static類成員
static修飾的變數先於物件存在,所以static修飾的變數要在類外初始化。因為static是所有物件共享的東西嘛,必須要比物件先存在的。
class Text { public: static int count; }; int Text::count=0;//用static成員變數必須要初始化 int main() { Text t1; Text t2; t1.count = 100; //t1物件把static成員count改為100 cout<<t2.count<<endl; //當t2物件列印static成員的時候,顯示的是100而不是0 return 0; }
好處:
用static修飾的成員變數在物件中是不佔記憶體的,因為他不是跟物件一起在堆或者棧中生成,用static修飾的變數在靜態儲存區生成的,所以用static修飾一方面的好處是可以節省物件的記憶體空間。就如同你建立100個Person物件,而這100個物件都有共有的一個變數,例如叫國籍變數,就是Person物件的國籍都是相同的,那如果國籍變數用static修飾的話,即使有100個Person物件,也不會建立100個國籍變數,只需要有一個static修飾的國籍變數就可以了,這100個物件要用時,就會去呼叫static修飾的國籍變數。否則有100個Person變數,就會建立100個國籍變數,在國籍變數都是相同的情況下,就等於浪費空間了,因為你不需要建立100個國籍變數,
2.static類成員函式
由於static修飾的類成員屬於類,不屬於物件,因此static類成員函式是沒有this指標的,this指標是指向本物件的指標。正因為沒有this指標,所以static類成員函式
不能訪問非static的類成員,只能訪問 static修飾的類成員。
class Text
{
public:
static int fun()
{
return num;
}
static int count;
int num;
};
int Text::count=5;//用static成員變數必須要初始化
int main()
{
Text t1;
Text t2;
t1.num=100;
t1.fun();//發生錯誤,fun函式return的是非static類成員 如果return count就正確
return 0;
}