1. 程式人生 > >C++static類成員,static類成員函式

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;
}