靜態成員遵守訪問權限的限定規則。 static type dataname;
靜態成員數據時屬于類的,整個類只有一份拷貝,相當于類的全局變量,供該類所有對象共用,能夠被該類的所有對象所訪問;非靜態成員數據是屬于對象的,每個對象都有非靜態成員數據的一份拷貝,為該對象專用。
靜態成員函數也是屬于整個類的,它只能訪問屬于該類的靜態成員(包括靜態成員數據和靜態成員函數)。
在類的聲明中將數據成員指定為靜態成員,只是一種聲明,并不會為該數據成員分配內存空間,在使用之前應該對它進行定義。靜態數據成員常常在類外進行定義: 類型 類名::靜態成員名 類型 類名::靜態成員名=初始值; 例如:
#include <iostream>using namespace std;class A { static int a; public: int get() { return a; }};int A::a = 1;int main () { A a; cout << a.get() << endl; return 0;}注意: 1、在類外定義數據成員時,不能加上static限定詞; 2、在定義靜態數據成員時可以指定初始值,若沒有則默認為0.
原則上類的靜態數據成員必須在類外定義,否則就會出錯,若沒有,則會在定義該類的第一個對象時定義相關的靜態數據成員,即為所有的靜態數據成員分配內存空間,并初始化為0。 換句話說,靜態成員和全局變量一樣,只是編譯器將其限制在類作用域內了。
靜態成員屬于整個類,如果將它定義為類的公有成員,就可在類外用下面兩種方式訪問: 1、通過類名訪問(非靜態不可以) 類名::靜態數據成員名; 類名::靜態成員函數名( ); 2、通過對象訪問 對象名.成員名
例如: 一個book類,每一個對象表示一本書。書的總本數和總價格會動態變化,如果不將其設置為靜態數據成員,只有通過全局變量才能實現這樣的功能,但全局變量會破壞類的封裝性,給程序維護帶來負擔,也可能會誤改。因為靜態成員函數屬于整個類,不論通過哪個對象調用到的靜態成員函數都是相同的,因此建議通過以 類名::靜態成員函數名( ); 的方式來調用以區別普通成員函數。
說明: 1、靜態成員函數可以在類內部或外部定義,還可以定義成內聯函數; 2、靜態函數只能訪問靜態成員; 3、在類外定義靜態成員函數時,不能加上static限定詞; 4、靜態成員函數可以在定義類的任何對象之前被調用,非靜態成員只有在定義對象后,通過對象才能訪問。
補充文章
新聞熱點
疑難解答
圖片精選