国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

c++中的static和extern

2019-11-06 08:10:55
字體:
供稿:網(wǎng)友

一、static本質(zhì)作用

與static相對的關(guān)鍵字是auto,兩者是一對。我們一般聲明變量,如:int a,其實(shí)都是auto int a,只是auto省略了而已,但是static不能省略。要理解static,最好先理解auto。auto的含義是由程序自動控制變量的生存周期,通常是變量在進(jìn)入其作用域的時候被分配,離開其作用域的時候被釋放;而static則不同,變量在程序初始化時被分配,直到程序退出前才被釋放;也就是static是按照程序的生命周期來分配釋放變量的,而不是按照變量自己的生命周期。

二、static用法

1.局部變量

如:

void func()  {  int a;  static int b;  }

 就算函數(shù)結(jié)束了,b的值也能夠一直保持。每一次調(diào)用該函數(shù),變量a都是新的,因?yàn)樗窃谶M(jìn)入函數(shù)體的時候被分配,退出函數(shù)體的時候被釋放,所以多個線程調(diào)用該函數(shù),都會擁有各自獨(dú)立的變量a,因?yàn)樗偸且恢匦路峙涞?;而變量b不管你是否使用該函數(shù),在程序初始化時就被分配的了,或者在第一次執(zhí)行到它的聲明的時候分配(不同的編譯器可能不同),所以多個線程調(diào)用該函數(shù)的時候,總是訪問同一個變量b,這也是在多線程編程中必須注意的!

一般情況下,對于局部變量是存放在棧區(qū)的,并且局部變量的生命周期在該語句塊執(zhí)行結(jié)束時便結(jié)束了。但是如果用static進(jìn)行修飾的話,該變量便存放在靜態(tài)數(shù)據(jù)區(qū),其生命周期一直持續(xù)到整個程序執(zhí)行結(jié)束。但是在這里要注意的是,雖然用static對局部變量進(jìn)行修飾過后,其生命周期以及存儲空間發(fā)生了變化,但是其作用域并沒有改變,其仍然是一個局部變量,作用域僅限于該語句塊。

2.類的靜態(tài)數(shù)據(jù)成員

class A

    PRivate:

static int s_value;

};

   類的靜態(tài)成員必須初始化才能使用,道因?yàn)樗窃诔绦虺跏蓟臅r候分配的,所以必須有初始化,類中只是聲明,在cpp中才是初始化,靜態(tài)成員初始化與一般數(shù)據(jù)成員初始化不同。靜態(tài)數(shù)據(jù)成員初始化的格式如下:

 int A::s_value = 0;//<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>,注意,這里沒有static的修飾!

   使用靜態(tài)成員時,可以通過雙冒號(即<類名>::<靜態(tài)成員名>)。

   類的靜態(tài)成員是該類所有實(shí)例的共用成員,也就是在該類的范疇內(nèi)是個全局變量,也可以理解為是一個名為A::s_value的全局變量,只不過它是帶有類安全屬性的。道理很簡單,因?yàn)樗窃诔绦虺跏蓟臅r候分配的,所以只分配一次,所以就是共用的。

3.類的靜態(tài)成員函數(shù)

class A 

 { 

    private:

void init();

static void output();

};

void main()    {A::init();A::output();    }//A::init();會出錯,因?yàn)椴荒芡ㄟ^類名來調(diào)用類的非靜態(tài)成員函數(shù)。

void main()    {A pt;pt.init();pt.output();    }//編譯通過,因?yàn)轭惖膶ο罂梢允褂渺o態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)。

  靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,它們都屬于類的靜態(tài)成員,不是對象成員。因此,對靜態(tài)成員的引用不需要用對象名,當(dāng)然,通過對象來使用也可以。在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中不能直接引用類的非靜態(tài)成員,可以引用類中的靜態(tài)成員。如果靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時,可通過對象來引用。因?yàn)殪o態(tài)成員函數(shù)屬于整個類,在類實(shí)例化對象之前就已經(jīng)分配空間了,而類的非靜態(tài)成員必須在類實(shí)例化對象后才有內(nèi)存空間,所以調(diào)用就會出錯,就好比沒有聲明一個變量卻提前使用它一樣。

實(shí)現(xiàn)的時候也不需要static的修飾,因?yàn)閟tatic是聲明性關(guān)鍵字;類的靜態(tài)函數(shù)是在該類的范疇內(nèi)的全局函數(shù),實(shí)際上,它就是增加了類的訪問權(quán)限的全局函數(shù):void A::output();

注意:靜態(tài)成員函數(shù)可以繼承和覆蓋,但無法是虛函數(shù);在類的非靜態(tài)成員函數(shù)中可以使用類的靜態(tài)成員。

4.文件內(nèi)全局變量

若在cpp中有,static int g_value = 0;

這個變量的含義是在該cpp內(nèi)有效,其他的cpp文件不能訪問這個變量;如果有兩個cpp文件聲明了同名的全局靜態(tài)變量,那么他們實(shí)際上是獨(dú)立的兩個變量;如果不使用static聲明全局變量:int g_value = 0;那么將無法保證這個變量不被別的cpp共享,也無法保證一定能被別的cpp共享。

如果在一個h文件中聲明:static int g_vaule = 0;

那么會為每個包含該頭文件的cpp都創(chuàng)建一個全局變量,但他們都是獨(dú)立的;所以也不建議這樣的寫法,因?yàn)橹皇莿?chuàng)建了一組同名而不同作用域的變量;

在cpp內(nèi)聲明: static void func();

函數(shù)的實(shí)現(xiàn)不需要static修飾,那么這個函數(shù)只可在本cpp內(nèi)使用,不會同其他cpp中的同名函數(shù)引起沖突;不要在頭文件中聲明static的全局函數(shù),不要在cpp內(nèi)聲明非static的全局函數(shù),如果你要在多個cpp中復(fù)用該函數(shù),就把它的聲明提到頭文件里去,否則在cpp內(nèi)部聲明需要加上static修飾;在C語言中這點(diǎn)尤為重要!

三、extern

   在C語言中,修飾符extern用在變量或者函數(shù)的聲明前,用來說明“此變量/函數(shù)是在別處定義的,要在此處引用”。在這里要注意extern聲明的位置對其作用域也有關(guān)系,如果是在main函數(shù)中進(jìn)行聲明的,則只能在main函數(shù)中調(diào)用,在其它函數(shù)中不能調(diào)用。其實(shí)要調(diào)用其它文件中的函數(shù)和變量,只需把該文件用#include包含進(jìn)來即可,為啥要用extern?因?yàn)橛胑xtern會加速程序的編譯過程,這樣能節(jié)省時間。

1.h文件中

在頭文件里聲明為extern的:extern int g_value; // 注意,不要初始化值!

然后在其中任何一個包含該頭文件的cpp中初始化(一次)就好:

int g_value = 0; // 初始化一樣不要extern修飾,因?yàn)閑xtern也是聲明性關(guān)鍵字;

然后所有包含該頭文件的cpp文件都可以用g_value這個名字訪問相同的一個變量。

2.cpp文件中

file1.c int a=1;  file2.c  #include<stdio.h> extern int a;  int main(void)  {  printf("%d/",a);  return 0;  } 這樣,file2就可以用file1中的int a了,但是如果在file1中把int a=1改為static int a=1;那么在file2.c是無法訪問到變量a的。原因在于用static對全局變量進(jìn)行修飾改變了其作用域的范圍,由原來的整個工程可見變?yōu)楸驹次募梢姟?p>

3.指示調(diào)用規(guī)范

在C++中extern還有另外一種作用,用于指示C或者C++函數(shù)的調(diào)用規(guī)范。比如在C++中調(diào)用C庫函數(shù),就需要在C++程序中用extern “C”聲明要引用的函數(shù)。這是給鏈接器用的,告訴鏈接器在鏈接的時候用C函數(shù)規(guī)范來鏈接。主要原因是C++和C程序編譯完成后在目標(biāo)代碼中命名規(guī)則不同,用此來解決名字匹配的問題。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 东平县| 昌邑市| 锦州市| 定远县| 楚雄市| 平陆县| 开阳县| 灵武市| 吴堡县| 丰县| 原平市| 松桃| 云林县| 香河县| 巴楚县| 平原县| 兴国县| 正蓝旗| 江源县| 那曲县| 清镇市| 芜湖市| 文安县| 星子县| 台北县| 靖安县| 奎屯市| 徐汇区| 眉山市| 都兰县| 深水埗区| 余干县| 永泰县| 青浦区| 衡水市| 洪江市| 永年县| 南江县| 荃湾区| 崇文区| 莱芜市|