C++ static 靜態成員變量在初始化時分配內存的,程序結束時釋放內存

總述

  • static 成員變量屬於類,不屬於某個具體的對象
  • static 成員變量必須在類聲明的外部初始化。
  • static 成員變量是在初始化時分配內存的,程序結束時釋放內存。
項目 內容
關鍵詞 static
訪問控制
初始化 類外初始化
分配內存時機 初始化時
釋放內存時機 程序結束時
內存分配位置 全局數據區

一般概念

靜態成員變量是一種特殊的成員變量,它被關鍵字static修飾。

class Student {
public:
    string getName() { return name; }

    static int total;//靜態成員變量
private:
    string name;
};

這個student類聲明瞭一個public的靜態成員變量total,用來表明學生的總數,這個變量爲這個類所共有,無論創建多少個學生對象,total變量在內存中都只有一個。

static 成員變量屬於類,不屬於某個具體的對象。 和普通的成員變量一樣,static 成員變量也有private、protected、public 的訪問控制。

初始化

static 成員變量必須在類聲明的外部初始化(除了一個例外,之後會說到),以剛剛的類爲例,其初始化具體形式爲:

int Student::total=0;
類型 類名::變量名=;(注意不必再加static
  • 初始化時可以賦初值,也可以不賦值。如果不賦值,那麼會被默認初始化爲 0。全局數據區的變量都有默認的初始值 0,而動態數據區(堆區、棧區)變量的默認值是不確定的,一般認爲是垃圾值。
  • 被 private、protected、public 修飾的靜態成員變量都可以用這種方式初始化。
    需要注意的是,static 成員變量是在初始化時分配內存的。 不是在類聲明時,也不是在創建對象時。因此,沒有初始化的static 成員變量無法使用,因爲還沒分配內存。

訪問方法

  • static 成員變量不佔用對象的內存,所以只要經過類外初始化,即使不創建對象也可以訪問
  • 可以通過對象名訪問,也可以通過類名訪問,但要遵循 private、protected 和 public 關鍵字的訪問權限限制。
//通過類類訪問 static 成員變量
Student::total = 10;
//通過對象來訪問 static 成員變量
Student stu;
stu.total = 20;
//通過對象指針來訪問 static 成員變量
Student *p_stu = new Student();
p_stu -> total = 20;

可以類內初始化的一個例外

類型static const int可以類內初始化,如下。

class Student {
public:
    string getName() { return name; }

    static const int total=1;//類內初始化
private:
    string name;
};

但在類內初始化了就不要在類外再進行一次,否則是重複定義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章