1.static類成員
C++primer里面說過,static類成員不像普通的類數據成員,static類數據成員獨立於一切類對象處在。static類數據成員是與類關聯的,
但不與該類定義的對象有任何關系。即static不會像普通類數據成員一樣每一個類對象都有一份,全部類對象是共享一個static類成員的。
例如A類對象修改了static成員為1,那么B對象對應的static類對象成員的值也會是1。
static 成員不占用類對象的空間

#include <iostream> using namespace std; class A{ public: A(){} ~A(){} private: static int x; //static int x=1;錯誤 static void m_data(int a) { x=a; } }; int A::x=1; int main() { A my_class; cout<<sizeof(my_class)<<endl; return 0; }
注意:static類對象必須要在類外進行初始化
class Text { public: static int count; }; int Text::count=0;//用static成員變量必須要初始化 int main() { Text t1; cout<<t1.count<<endl; return 0; }//程序輸出0
static修飾的變量先於對象存在,所以static修飾的變量要在類外初始化。因為static是所有對象共享的變量,必須要比對象先存在。
class Text { public: static int count; }; int Text::count=0;//用static成員變量必須要初始化 int main() { Text t1; Text t2; t1.count = 100; //t1對象把static成員count改為100 cout<<t2.count<<endl; //當t2對象打印static成員的時候,顯示的是100而不是0 return 0; }
2.static類成員函數
由於static修飾的類成員屬於類,不屬於對象,因此static類成員函數是沒有this指針的,this指針是指向本對象的指針。正因為沒有this指針,所以static類成員函數
不能訪問非static的類成員,只能訪問 static修飾的類成員。
class Text { public: static int fun() { return num; } static int count; int num; }; int Text::count=5;//用static成員變量必須要初始化 int main() { Text t1; Text t2; t1.num=100; t1.fun();//發生錯誤,fun函數return的是非static類成員 如果return count就正確 return 0; }
調用方法:
(1)通過類對象調用
(2)通過類名調用
#include <iostream> using namespace std; class Account{ public: static double m_rate; // 聲明:獨立於類的對象之外 static void set_rate(const double& x){ m_rate=x; } }; double Account:: m_rate=1.0; // 設初始化,設初值(定義:獲得內存) int main() { Account::set_rate(5.0); //類名調用 cout<<Account::m_rate<<endl; Account a; a.set_rate(7.0); // 對象調用靜態成員函數,編譯器將不再會在參數里添加this指針,這個隱含的操作 cout<<Account::m_rate<<endl; return 0; }