靜態成員函式和普通成員函式的區別
程式最終都將在記憶體中執行,變數只有在記憶體中佔有一席之地時才能被訪問。
類的靜態成員(變數和方法)屬於類本身,在類載入的時候就會分配記憶體,可以通過類名直接去訪問;非靜態成員(變數和方法)屬於類的物件,所以只有在類的物件產生(建立類的例項)時才會分配記憶體,然後通過類的物件(例項)去訪問。
在一個類的靜態成員中去訪問其非靜態成員之所以會出錯是因為在類的非靜態成員不存在的時候類的靜態成員就已經存在了,訪問一個記憶體中不存在的東西當然會出錯。
C++會區分兩種型別的成員函式:靜態成員函式和非靜態成員函式。這兩者之間的一個重大區別是,靜態成員函式不接受隱含的this自變數。所以,它就無法訪問自己類的非靜態成員。
靜態資料成員
在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態成員是類的所有物件中共享的成員,而不是某個物件的成員。
使用靜態資料成員可以節省記憶體,因為它是所有物件所公有的,因此,對多個物件來說,靜態資料成員只儲存一處,供所有物件共用。靜態資料成員的值對每個物件 都是一樣,但它的值是可以更新的。只要對靜態資料成員的值更新一次,保證所有物件存取更新後的相同的值,這樣可以提高時間效率。
靜態資料成員的使用方法和注意事項如下:
1、靜態資料成員在定義或說明時前面加關鍵字static。
2、靜態成員初始化與一般資料成員初始化不同。靜態資料成員初始化的格式如下:
<資料型別><類名>::<靜態資料成員名>=<值>
這表明:
(1) 初始化在類體外進行,而前面不加static,以免與一般靜態變數或物件相混淆。
(2) 初始化時不加該成員的訪問許可權控制符private,public等。
(3) 初始化時使用作用域運算子來標明它所屬類,因此,靜態資料成員是類的成員,而不是物件的成員。
3、靜態資料成員是靜態儲存的,它是靜態生存期,必須對它進行初始化。
4、引用靜態資料成員時,採用如下格式:
<類名>::<靜態成員名>
靜態成員函式
靜態成員函式和靜態資料成員一樣,它們都屬於類的靜態成員,它們都不是物件成員。因此,對靜態成員的引用不需要用物件名。
在靜態成員函式的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員。如果靜態成員函式中要引用非靜態成員時,可通過物件來引用
#include <iostream> using namespace std; class M { public: M(int a) { A=a; B+=a;} static void f1(M m); private: int A; static int B; }; void M::f1(M m) { cout<<“A=”<<m.A<<endl; //靜態成員函式中通過物件來引用非靜態成員 cout<<“B=”<<B<<endl; } int M::B=0; //靜態資料成員初始化的格式<資料型別><類名>::<靜態資料成員名>=<值> void main() { M P(5),Q(10); M::f1(P); //靜態成員函式呼叫時不用物件名 M::f1(Q); }
讀者可以自行分析其結果。從中可看出,呼叫靜態成員函式使用如下格式:
<類名>::<靜態成員函式名>(<引數表>);
執行結果:
A=5
B=15
A=10
B=15