C++static靜態成員變量


有時候我們希望在多個對象之間共享數據,對象 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;
}

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM