當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。
靜態資料成員的用途之一是統計有多少個物件實際存在。
靜態資料成員不能在類中初始化,實際上類定義只是在描述物件的藍圖,在其中指定初值是不允許的。也不能在類的建構函式中初始化該成員,因為靜態資料成員為類的各個物件共享,否則每次建立乙個類的物件則靜態資料成員都要被重新初始化。
靜態成員不可在類體內進行賦值,因為它是被所有該類的物件所共享的。你在乙個物件裡給它賦值,其他物件裡的該成員也會發生變化。為了避免混亂,所以不可在類體內進行賦值。
靜態成員的值對所有的物件是一樣的。靜態成員可以被初始化,但只能在類體外進行初始化。
一般形式:
資料型別類名::靜態資料成員名=初值
注意:不能用引數初始化表對靜態成員初始化。一般系統預設初始為0。
靜態成員是類所有的物件的共享的成員,而不是某個物件的成員。它在物件中不占用儲存空間,這個屬性為整個類所共有,不屬於任何乙個具體物件。所以靜態成員不能在類的內部初始化,比如宣告乙個學生類,其中乙個成員為學生總數,則這個變數就應當宣告為靜態變數,應該根據實際需求來設定成員變數。
#include "iostream"
using namespacestd;
class test
};int test::num = 10;
int main(void)
通過上例可知:
x+=5; // 這行**是錯誤的
靜態函式成員必須通過物件名來訪問非靜態資料成員。
另外,靜態成員函式在類外實現時候無須加static關鍵字,否則是錯誤的。
若在類的體外來實現上述的那個靜態成員函式,不能加static關鍵字,這樣寫就可以了:
int test::getnum()
1、static成員的所有者是類本身和物件,但是多有物件擁有一樣的靜態成員。從而在定義物件是不能通過建構函式對其進行初始化。
2、靜態成員不能在類定義裡邊初始化,只能在classbody外初始化。
3、靜態成員仍然遵循public,private,protected訪問準則。
4、靜態成員函式沒有this指標,它不能返回非靜態成員,因為除了物件會呼叫它外,類本身也可以呼叫。
靜態成員函式可以直接訪問該類的靜態資料和函式成員,而訪問非靜態資料成員必須通過引數傳遞的方式得到乙個物件名,然後通過物件名來訪問。
class myclass
;intmyclass::sum=0;
//定義並初始化靜態資料成員
myclass::myclass(int a,int b,int c)
void myclass::getsum()
由上例可知,非靜態成員函式可以任意地訪問靜態成員函式和靜態資料成員。
非靜態成員函式myclass(inta,int b,int c)和getsum()都訪問了靜態資料成員sum。
靜態成員函式不能訪問非靜態成員函式和非靜態資料成員。
與靜態資料成員不同,靜態成員函式的作用不是為了物件之間的溝通,而是為了能處理靜態資料成員。
我們知道,當呼叫乙個物件的成員函式(非靜態成員函式)時,系統會把該物件的起始位址賦給成員函式的this指標。而靜態成員函式並不屬於某一物件,它與任何物件都無關,因此靜態成員函式沒有this指標。既然它沒有指向某一物件,就無法對乙個物件中的非靜態成員進行預設訪問(即在引用資料成員時不指定物件名)。
可以說,靜態成員函式與非靜態成員函式的根本區別是:非靜態成員函式有this指標,而靜態成員函式沒有this指標。由此決定了靜態成員函式不能訪問本類中的非靜態成員。
靜態成員函式可以直接引用本類中的靜態資料成員,因為靜態成員同樣是屬於類的,可以直接引用。在c++程式中,靜態成員函式主要用來訪問靜態資料成員,而不訪問非靜態成員。
關於靜態成員函式,可以總結為以下幾點:
出現在類體外的函式定義不能指定關鍵字static;
靜態成員之間可以相互訪問,包括靜態成員函式訪問靜態資料成員和訪問靜態成員函式;
非靜態成員函式可以任意地訪問靜態成員函式和靜態資料成員;
靜態成員函式不能訪問非靜態成員函式和非靜態資料成員;
由於沒有this指標的額外開銷,因此靜態成員函式與類的全域性函式相比速度上會有少許的增長;
呼叫靜態成員函式,可以用成員訪問操作符(.)和(->)為乙個類的物件或指向類物件的指標呼叫靜態成員函式,
當同一類的所有物件使用乙個量時,對於這個共用的量,可以用靜態資料成員變數,這個變數對於同一類的所有的物件都取相同的值。靜態成員變數只能被靜態成員函式呼叫。靜態成員函式也是由同一類中的所有物件共用。只能呼叫靜態成員變數和靜態成員函式。
(總結:靜態成員函式只能訪問靜態資料成員,不能訪問非靜態資料成員;非靜態成員函式能訪問靜態資料成員和非靜態資料成員。(為了某些需求,比如可能某乙個變數不屬於具體的物件,而是屬於類,那麼這個成員就是靜態資料成員),在使用時,盡可能使用靜態成員函式訪問靜態資料成員,這樣更加清晰)
C 靜態資料成員和靜態成員函式
1.如何實現屬於某個類的所有物件共享某個資料?解決的辦法 將所要共享的資料說明為全域性變數,但這將破壞資料的封裝性 較好的解決辦法是將所要共享的資料說明為類的靜態成員。2.靜態資料成員是類中所有物件共享的成員,而不是某個物件的成員,所以必須對它初始化,且對它的初始化不能在建構函式中進行 靜態資料成員...
C 靜態資料成員和靜態成員函式
在c 物件導向程式設計過程當中,物件與物件之間的資料不是共享,在設計類的時候,有時候需要一些物件之間共享的資料,除了把所要共享的資料設定為全域性資料或者函式之外,還可以利用c 的靜態機制。1 靜態資料成員 class 類名 靜態資料成員是所有物件共享的,其所佔的記憶體空間不會因為某個物件的產生而分配...
C 靜態成員和靜態成員函式
一 靜態資料成員 類體中的資料成員的宣告前加上static關鍵字,該資料成員就成為了該類的靜態資料成員。和其他資料成員一樣,靜態資料成員也遵守public protected private訪問規則。同時,靜態資料成員還具有以下特點 1 靜態資料成員的定義。靜態資料成員實際是類域中的全域性變數,其定...