(一)靜態數據成員 函數
靜態數據成員是類的全部對象共享的成員,而不是某個對象的成員。 this
使用靜態數據成員能夠節省內存,靜態數據成員只存儲一處,供全部對象使用。靜態數據成員至關於類中的「全局變量」(一個對象改變了它的值,例如改變的值爲a,那麼其餘對象看到它的值爲都爲a)。 spa
使用靜態成員的方法和注意事項: 指針
一、 靜態數據成員在定義或說明是前面加上關鍵字「static」 對象
eg: private: 內存
int a; get
static int staticVariable;//定義了一個靜態變量 class
二、靜態成員的初始化 變量
(1)初始化在類體外進行,前面不加static,以避免與通常靜態變量或對象相混淆。 權限
(2)初始化時使用做用於運算符(::)來標明他所屬的類(這也說明了靜態數據成員是屬於類的,而不是屬於某個對象的。)
eg: class A {
private:
int a ;
public:
static int staticVariable;
};
int A::staticVariable = 0; //在類外進行初始化,並加上做用於運算符(::)
注意:靜態數據成員存放在靜態存儲區,必須對它進行初始化。
三、引用靜態成員的格式
若是靜態成員的訪問權限是public,則能夠用
<類名> ::<靜態成員名>的格式來訪問
eg:A ::staticVariable = 10;
舉一個例子:
class Number{
private:
int a,b;
static int staticVarible;
public:
void getVariable(){
cout << a << "," << b <<"," << staticVarible << endl;
}
void getStaticVarible(){
cout << staticVarible << endl;
}
Number (int a , int b , int c){
this->a = a;//當參數的名字與類中變量名相同時,用this指針加以區分
this->b = b;
this->staticVarible = c;
}
};
int Number :: staticVarible = 3;// 類外初始化靜態數據成員
void main(){
Number M(3,7,1);
M.getVariable();
Number N(10,8,11);
N.getVariable();
M.getStaticVarible();
N.getStaticVarible();
}
輸出結果:
3,7,1
10,8,11
11
11
結果代表了在初始化了N之後,M中的StaticVarible的值變成了11,說明了靜態數據成員是多個對象共享的。
(二)靜態成員函數:
靜態成員函數與靜態成員同樣,都屬於類,而不屬於某個對象。所以,對靜態成員的引用能夠用類名。
注意:靜態成員函數的實現中能夠直接引用類中說明的靜態成員,不能夠直接引用類中說明的非靜態成員(爲何不能引用呢?由於非靜態成員只能經過對象來調用,而不能經過類來調用,意味着在沒有對象存在時,非靜態成員是不分配內存的,若是靜態成員函數用了非靜態成員那麼將產生錯誤)。靜態成員函數若是要引用非靜態成員時,能夠經過對象來訪問。
舉一個例子:
class Number{
private:
int a,b;
static int staticVarible;
public:
Number (int a , int b , int c){
this->a = a;
this->b = b;
this->staticVarible = c;
}
int getStaticVarible(){
return staticVarible;
}
//靜態成員函數能夠在類內定義也能夠在類外定義
static void printStaticVarible(){
cout << staticVarible;
};
static void printVaribles(Number f);
};
int Number :: staticVarible = 3;
void Number::printVaribles(Number f){
/*----這裏用 f 能夠調用類中的私有成員,是由於 printVaribles(Number f) 是類函數的緣故----*/
f.printA();//只能用對象來訪問非靜態成員函數
cout << "b = " << f.b << endl;//只能用對象類訪問非靜態數據成員
cout << "staticVarible = " << staticVarible << endl ;//能夠直接訪問靜態數據成員
printStaticVarible();//能夠直接訪問靜態成員函數
}
void main(){
Number M(3,7,1);
Number N(10,8,11);
/*------------兩種方式調用靜態成員函數-----------------*/
M.printVaribles(M);//經過對象調用
Number::printVaribles(N);//經過類名來調用
}
輸出結果:
a = 3
b = 7
staticVarible = 11
靜態成員函數 staticVarible = 11
a = 10
b = 8
staticVarible = 11
靜態成員函數 staticVarible = 11