靜態成員變數和成員函式
阿新 • • 發佈:2019-01-10
若將成員變數宣告為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 }