C/Cpp / 类中静态成员变量和普通成员变量的区别
實例代碼:
#include <iostream> class CMan { public:CMan() {}~CMan() {} public:int k_;// 僅僅是聲明。static int i_; };// 定義,申請內存。 int CMan::i_ = 0;int main() {//CMan::k = 15; ?//error: 對非靜態成員“CMan::k”的非法引用CMan::i_ = 10;CMan *p1 = new CMan();CMan *p2 = new CMan();p1->k_ = 15;std::cout << "第一次測試" << "\n";std::cout << "i_ = " << CMan::i_ << "\n";std::cout << "k_ = " << p1->k_ << "\n" << "\n";p2->k_ = 20;CMan::i_ = 30;std::cout << "第二次測試" << "\n";std::cout << "i_ = " << CMan::i_ << "\n";std::cout << "k_ = " << p2->k_ << "\n";std::cin.get();delete p1; p1 = nullptr;delete p2; p2 = nullptr;return 0; }
運行結果:
由上述代碼可知二者的不同:
一、根本點
(1)普通成員變量:在每一個類對象中定義一次,互相直接不受影響。
(2)靜態成員變量:類外定義一次,所有對象共享此內存塊。
二、聲明方式
(1)普通成員變量:int i;
(2)靜態成員變量:static int i;
三、定義位置(內存分配位置)
?1. 普通成員變量 :
?- 若CMan A,則存儲在棧(stack)中;
?
?- 若CMan *pA = new CMan(),則存儲在堆(heap)中 。
?
?2. 靜態成員變量:全局區(靜態區)。
解釋:因為類靜態成員變量不能在類中定義,故只能定義在類外,即存儲位置在全局區(若類中可以定義,則每一個對象都可以為此靜態成員變量申請內存,就不能達到所有對象共享此靜態成員變量的目的)。
四、初始化位置
?1. 普通成員變量:類中,通常在構造函數中。
?2. 靜態成員變量:可以在類中初始化,但需要明白,如果在構造函數中初始化,則每一次申請一個此類的新的對象,此變量都會被重新初始化。所以通常在類外進行一次初始化即可。一般系統缺省初始為0。
五、注意
?1. 靜態成員變量的應用之一就是記錄此類申請了多少個對象(這樣能夠理解這種變量類型的意義了吧)。
?2. 聲明靜態成員變量是需加上關鍵字“static”,定義靜態成員變量時不可加關鍵字“static”。
?3. 靜態成員仍然遵循public,private,protected訪問準則。
?4. 聲明:告訴編譯器,有個某類型的變量將來需要被申請內存。
? ? ?定義:為變量申請內存。
? ?初始化:對已經申請了內存的變量賦一個初始值。
?5. 實例代碼鏈接:http://download.csdn.net/download/itworld123/10154070
總結
以上是生活随笔為你收集整理的C/Cpp / 类中静态成员变量和普通成员变量的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cpp 对象模型探索 / 单一继承的类的
- 下一篇: Cpp 对象模型探索 / 对象访问成员变