C static靜態成員變數詳解

2022-07-07 11:33:09 字數 2372 閱讀 5751

class student;
物件的記憶體中包含了成員變數,不同的物件占用不同的記憶體(已在《c++物件的記憶體模型》中提到),這使得不同物件的成員變數相互獨立,它們的值不受其他物件的影響。例如有兩個相同型別的物件 a、b,它們都有乙個成員變數 m_name,那麼修改 a.m_name 的值不會影響 b.m_name 的值。

可是有時候我們希望在多個物件之間共享資料,物件 a 改變了某份資料後物件 b 可以檢測到。共享資料的典型使用場景是計數,以前面的 student 類為例,如果我們想知道班級中共有多少名學生,就可以設定乙份共享的變數,每次建立物件時讓該變數加 1。

在c++中,我們可以使用靜態成員變數來實現多個物件共享資料的目標。靜態成員變數是一種特殊的成員變數,它被關鍵字static修飾,例如:

class student;
這段**宣告了乙個靜態成員變數 m_total,用來統計學生的人數。

static 成員變數屬於類,不屬於某個具體的物件,即使建立多個物件,也只為 m_total 分配乙份記憶體,所有物件使用的都是這份記憶體中的資料。當某個物件修改了 m_total,也會影響到其他物件。

static 成員變數必須在類宣告的外部初始化,具體形式為:

//type class::name = value;

int student::m_total=0;

靜態成員變數在初始化時不能再加 static,但必須要有資料型別。被 private、protected、public 修飾的靜態成員變數都可以用這種方式初始化。

注意:static 成員變數的記憶體既不是在宣告類時分配,也不是在建立物件時分配,而是在(類外)初始化時分配。反過來說,沒有在類外初始化的 static 成員變數不能使用。

static 成員變數既可以通過物件來訪問,也可以通過類來訪問。請看下面的例子:

//通過類類訪問 static 成員變數

student::m_total = 10;

//通過物件來訪問 static 成員變數

student stu("小明", 15, 92.5f);

stu.m_total = 20;

//通過物件指標來訪問 static 成員變數

student *pstu = new student("李華", 16, 96);

pstu -> m_total = 20;

下面來看乙個完整的例子:

#include using namespace std;

class student;

//初始化靜態成員變數

int student::m_total = 0;

student::student(char *name, int age, float score): m_name(name), m_age(age), m_score(score)

void student::show()

執行結果:

小明的年齡是15,成績是90(當前共有1名學生)

李磊的年齡是16,成績是80(當前共有2名學生)

張華的年齡是16,成績是99(當前共有3名學生)

王康的年齡是14,成績是60(當前共有4名學生)

本例中將 m_total 宣告為靜態成員變數,每次建立物件時,會呼叫建構函式使 m_total 的值加 1。

之所以使用匿名物件,是因為每次建立物件後只會使用它的 show() 函式,不再進行其他操作。不過使用匿名物件無法**記憶體,會導致記憶體洩露,在中大型程式中不建議使用。

幾點說明

乙個類中可以有乙個或多個靜態成員變數,所有的物件都共享這些靜態成員變數,都可以引用它。

static 成員變數和普通 static 變數一樣,都在記憶體分割槽中的全域性資料區分配記憶體,到程式結束時才釋放。這就意味著,static 成員變數不隨物件的建立而分配記憶體,也不隨物件的銷毀而釋放記憶體。而普通成員變數在物件建立時分配記憶體,在物件銷毀時釋放記憶體。

靜態成員變數必須初始化,而且只能在類體外進行。例如:

int student::m_total = 10;

初始化時可以賦初值,也可以不賦值。如果不賦值,那麼會被預設初始化為 0。全域性資料區的變數都有預設的初始值 0,而動態資料區(堆區、棧區)變數的預設值是不確定的,一般認為是垃圾值。

靜態成員變數既可以通過物件名訪問,也可以通過類名訪問,但要遵循 private、protected 和 public 關鍵字的訪問許可權限制。當通過物件名訪問時,對於不同的物件,訪問的是同乙份記憶體。

C static靜態成員變數

有時候我們希望在多個物件之間共享資料,物件 a 改變了某資料後物件 b 可以檢測到。共享資料的典型使用場景是計數 以 student 類為例,如果我們想知道班級中共有多少名學生,就可以設定乙份共享的變數,每次建立物件時讓該變數加 1 在c 中,我們可以使用靜態成員變數來實現多個物件共享資料的目標。靜...

C static靜態成員

class a a void fun 普通成員函式 static void printnum 靜態成員函式 private int m a 普通成員變數 int m b 普通成員變數 static int num 靜態成員變數 靜態成員必須在定義類的檔案中對靜態成員變數進行初始化,否則會編譯出錯。i...

C static 靜態成員

靜態成員包括靜態資料成員和靜態成員函式,提供了同類物件間資料成員的共享機制 靜態成員不是某個物件的成員,是類所有物件的共享成員,只建立乙個成員副本 定義格式 static 型別 成員名 引用格式 類名 靜態成員 初始化格式 型別 類名 靜態資料成員 初始化值 靜態資料成員為同類所有物件所共享,不能使...