總述
- 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;
};
但在類內初始化了就不要在類外再進行一次,否則是重複定義。