1. 程式人生 > >靜態成員變數和成員函式

靜態成員變數和成員函式

  若將成員變數宣告為static,則為靜態成員變數,與一般的成員變數不同,無論建立多少物件,都只有一個靜態成員變數的拷貝,靜態成員變數屬於一個類,所有物件共享。靜態變數在編譯階段就分配了空間,物件還沒建立時就已經分配了空間,放到全域性靜態區

靜態成員變數

  注意事項:(1)最好是類內宣告,類外初始化(以免類名訪問靜態成員訪問不到);(2)無論公有,私有,靜態成員都可以在類外定義,但私有成員仍有訪問許可權;(3)非靜態成員類外不能初始化;(4)靜態成員資料是共享的。

 1 class Person{
 2 public:
 3     static int m_age;//靜態成員變數,會共享資料,物件保有的是最後一次修改的值
4 //最好類內宣告,類外初始化 5 6 //靜態成員建議在類外進行初始化,但在類內也可以初始化,只是通過類名訪問靜態成員的屬性時,訪問不到 7 //所以一般不這麼做 8 public: 9 Person(){ 10 m_age = 10; 11 } 12 13 private: 14 int other; 15 static int m_other; 16 }; 17 int Person::m_age = 0; 18 int Person::other = 10; //非靜態成員不能在類外部定義 19 int Person::m_other = 20
; //靜態成員可以在類外定義 20 21 void test01(){ 22 //通過物件訪問屬性 23 Person p1; 24 p1.m_age = 10; 25 26 Person p2; 27 p2.m_age = 20; 28 29 cout << "p1.age = " << p1.m_age << endl; //20 30 cout << "p2.age = " << p2.m_age << endl; //20 31 32 //通過類名訪問屬性 33 cout << "
類名訪問屬性" << Person::m_age << endl; //20 34 35 //靜態成員雖然在類外可以定義,但在類外不可訪問 36 cout << "類名訪問屬性" << Person::m_other << endl; //私有成員,不可訪問 37 } 38 39 int main(){ 40 41 test01(); 42 system("pause"); 43 return 0; 44 }

靜態成員函式

  靜態成員函式也是物件共享的:(1)靜態成員函式可以直接訪問靜態成員變數,不能直接訪問普通成員變數,但可以通過引數傳遞的方式訪問。(2)普通成員函式可以訪問普通成員變數,也可以訪問靜態成員變數。(3)靜態成員函式沒有this指標

  非靜態資料成員為物件單獨維護,但靜態成員函式為共享函式,無法區分是哪個物件,因此不能直接訪問普通變數成員,也沒有this指標。

 1 class Person{
 2 public:
 3     static int m_age;
 4     int m_n;
 5 
 6 public:
 7     static void myfunc(int &a){
 8         m_age = 10; 
 9         a = 0;
10         //m_n = 1;//不可以直接訪問非靜態成員
11     }
12 
13     void myfunc02(){
14         m_age = 10;
15         m_n = 0;
16     }
17 private:
18     static void myfunc01(){}
19 };
20 
21 
22 void test01(){
23     //通過物件訪問成員函式
24     Person p1;
25     p1.myfunc(p1.m_n); //可以通過引數傳遞訪問非靜態成員
26 
27     //通過類名訪問成員函式
28     cout << "類名訪問屬性" << Person::myfunc << endl; //20
29 
30     //在類外不可訪問私有靜態成員函式
31     //cout << "類名訪問屬性" << Person::myfunc01 << endl; //私有成員,不可訪問
32 }