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