
有時候我們希望在多個對象之間共享數據,對象 a 改變了某數據后對象 b 可以檢測到。共享數據的典型使用場景是計數
以 Student 類為例,如果我們想知道班級中共有多少名學生,就可以設置一份共享的變量,每次創建對象時讓該變量加 1
在C++中,我們可以使用靜態成員變量來實現多個對象共享數據的目標。靜態成員變量是一種特殊的成員變量,它被關鍵字static修飾
#include <iostream> #include <string> using namespace std; class Student { public: Student(const string& name1, int age1) { } public: static int m_total; //靜態成員變量 /* static 成員變量屬於類,不屬於某個具體的對象,即使創建多個對象,也只為 m_total 分配一份內存,所有對象使用的都是這份內存中的數據。當某個對象修改了 m_total,也會影響到其他對象 static 成員變量必須在類聲明的外部初始化: 格式:變量類型 類名::變量名 = 初始化值; static 成員變量和普通的 static 變量類似,都在內存分區中的全局數據區分配內存 */ private: string m_name; int m_age; }; int Student::m_total = 0; //初始化靜態成員變量 //靜態成員變量在初始化時不能再加 static,但必須要有數據類型。被 private、protected、public 修飾的靜態成員變量都可以用這種方式初始化 //注意:static 成員變量的內存既不是在聲明類時分配,也不是在創建對象時分配,而是在(類外)初始化時分配。反過來說,沒有在類外初始化的 static 成員變量不能使用 int main() { //static 成員變量既可以通過對象來訪問,也可以通過類來訪問 Student::m_total = 10; //通過類訪問 Student stu("張三", 25); stu.m_total = 20; //通過對象來訪問 Student* pstu = new Student("李華", 16); pstu->m_total = 30; //通過對象指針來訪問 cout << Student::m_total << endl; return(0); }
完整的例子:計數功能
#include <iostream> #include <string> using namespace std; class Student { public: Student(const string& name1, int age1) { m_name = name1; m_age = age1; m_total++; } public: static int m_total; private: string m_name; int m_age; }; int Student::m_total = 0; int main() { Student s1("張三", 15); Student s2("李明", 52); Student s3("李四", 15); cout << Student::m_total << endl; return(0); }
特殊場景:static、const同時修飾的成員變量
#include <iostream> using namespace std; class A { public: A(int i=0)/*:spec(i) 錯 */{} static const int spec=10; //對 }; //int A::spec = 10; //錯 /* 上面兩處錯誤原因:修飾符static只能在類外初始化,修飾符const(引用、類對象)只能用初始化列表初始化,兩者相互矛盾 解決辦法:只能在聲明時初始化 */ int main() { return 0; }

