新聞中心
static,即靜態(tài)聲明。它在 作用域、存儲(chǔ)方式、生命周期 等各方面影響一個(gè)變量或函數(shù)。文章將從 局部變量、全局變量、普通函數(shù)、類的static成員(包括數(shù)據(jù)成員與成員函數(shù))來總結(jié)static。

成都創(chuàng)新互聯(lián)公司提供高防服務(wù)器、云服務(wù)器、香港服務(wù)器、德陽電信服務(wù)器托管等
-
全局變量
所有的全局變量,無論是否是static的,都是存儲(chǔ)于靜態(tài)存儲(chǔ)區(qū)的。全局變量本身就是靜態(tài)存儲(chǔ)方式,將全局變量聲明為static是為了將變量的作用域限制在本翻譯單元中(本源文件中),使該全局變量不能被源程序的其他翻譯單元所引用。普通全局變量使用extren聲明可以拓展其作用域至其他翻譯單元中。
可以總結(jié)為:static改變了全局變量的作用域,而不改變變量的存儲(chǔ)位置與生命周期。
-
局部變量
局部變量即在函數(shù)內(nèi)定義的或在塊中定義的變量。static對(duì)局部變量的作用不同于全局變量。普通局部變量在離開其作用域(如離開定義它的函數(shù)或塊的花括號(hào))時(shí)即消失,而static變量卻存在于程序運(yùn)行的整個(gè)過程,也即是說,static聲明改變了局部變量的生命周期。普通局部變量是存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)的(堆),而static局部變量是存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū),因而普通局部變量在函數(shù)每次被調(diào)用時(shí)都被重新分配內(nèi)存地址,而靜態(tài)局部變量則在程序運(yùn)行過程中占據(jù)固定的內(nèi)存。
可以總結(jié)為:static改變了局部變量的存儲(chǔ)方式與生命周期,而不改變變量的作用域。
-
普通函數(shù)
這里的普通函數(shù)是為了與類的成員函數(shù)區(qū)別開來。函數(shù)在定義時(shí)默認(rèn)是外部的,通過extren聲明即可被其他源文件引用,static聲明將函數(shù)的作用域限制在本翻譯單元中,成為內(nèi)部函數(shù)。static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)調(diào)用中維持一份拷貝。
可以總結(jié)為:static使得函數(shù)在內(nèi)存中只有一份,并將函數(shù)作用域限制在當(dāng)前源文件。
另外,static有幾個(gè)優(yōu)點(diǎn)總被提起:
1. 避免了鏈接時(shí)與其他源文件中的變量命名引起沖突。
2.對(duì)于c函數(shù)而言,static對(duì)函數(shù)進(jìn)行了信息屏蔽,只給當(dāng)前文件中其他函數(shù)使用。
-
類static成員
static聲明對(duì)類成員的作用可以這樣概括:static使得成員從“屬于類對(duì)象”變成了“屬于類,而不屬于類對(duì)象”。
對(duì)于數(shù)據(jù)成員:
1.static數(shù)據(jù)成員必須在類定義體的外部進(jìn)行定義。
class BOOK
{
private:
//折扣
static float discount;
};
//在類定義體外部定義并初始化
float BOOK::discount = 0.95f;
2.不像普通數(shù)據(jù)成員,static數(shù)據(jù)成員不能在構(gòu)造函數(shù)中進(jìn)行初始化。正如上面所說,它只能在類外部定義并初始化。然而有一個(gè)例外,整型的const static 數(shù)據(jù)成員可以在類的定義體中進(jìn)行初始化。但需注意的是,const static數(shù)據(jù)成員在類的定義體中初始化時(shí),該數(shù)據(jù)成員仍必須在類的定義體之外進(jìn)行定義(不必再指定初始值了)。
class BOOK
{
private:
//折扣
const static int discount=1;
};
const int BOOK::discount;
-
類static成員函數(shù)
在類內(nèi)部聲明的static成員函數(shù),在類定義體外部進(jìn)行定義時(shí)無須重復(fù)指定static關(guān)鍵字。
對(duì)于static成員函數(shù),它同樣是不屬于類對(duì)象的,因而它沒有this指針。它可以直接訪問類的static數(shù)據(jù)成員,不能直接使用非static成員,原因是非static數(shù)據(jù)成員屬于類對(duì)象,使用非static數(shù)據(jù)成員時(shí)必須通過this指針來確定是這些成員屬于哪個(gè)類對(duì)象,然而上面說了,static成員函數(shù)沒有this指針。
static成員函數(shù)不能被聲明為const。實(shí)際上,成員函數(shù)被聲明為const的本質(zhì)是它向編譯器保證不會(huì)通過這個(gè)函數(shù)來修改類對(duì)象在內(nèi)存中的每一個(gè)bit的內(nèi)容(可以看《effective C++》 條款03 “盡可能使用const” ),然而我們知道,static成員函數(shù)并不屬于類對(duì)象,更談不上要保證不修改某一對(duì)象的內(nèi)存了。
另外,虛函數(shù)不能為聲明為static,為什么呢?原因還是static成員函數(shù)沒有this指針。virtual funtion運(yùn)行時(shí)綁定是多態(tài)的基礎(chǔ),沒有this指針多態(tài)的概念無法踐行。】
標(biāo)題名稱:static關(guān)鍵字的使用方法
文章源于:http://www.dlmjj.cn/article/ccopoog.html


咨詢
建站咨詢
