天天看點

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

 總結:

> 類中的static資料成員需要在類之外進行初始化

  > 被類或類建立的對象共享

  > 全局/靜态區

  靜态成員函數

  > 它的形參清單之中沒有隐含的this指針

  > 不能調用非靜态的資料成員

  > 不能調用非靜态的成員函數

  > 隻能調用靜态的成員

  > 可以直接通過類名調用