1,代碼塊作用域。聲明位于一對大括號之間,有效范圍從聲明開始至代碼塊結(jié)束。 2,文件作用域。聲明位于所有代碼塊之外,有效范圍從聲明開始至文件尾。 3,函數(shù)作用域。函數(shù)內(nèi)有效。一般只針對goto語句所用到的標(biāo)簽。 4,原型作用域。只適用于函數(shù)聲明的括號內(nèi)。(用到比較少) 例1:
typedef char *charPtr; //文件作用域charPtr ch_a;//文件作用域int int_a;//文件作用域int fun_a(int int_b);//fun_a是文件作用域,int_b是原型作用域int main(void){ int int_c = 0;//代碼塊作用域 { charPtr ch_c; //代碼塊作用域 int int_d; //代碼塊作用域 } fun_a(100); return 0;}int fun_a(int int_b) //int_b是代碼塊作用域{ goto stop;stop: //函數(shù)作用域。 return int_b + 1;}1,無鏈接。正常的變量,多次不相互沖突的聲明被當(dāng)作不同的變量實體。被存儲在不同的位置。 2,內(nèi)部鏈接。同一個文件內(nèi)多次聲明的同名變量,指的是同一個實體。位于不同的源文件則指不同的實體。(關(guān)鍵字static) 3,外部鏈接。同一個PRogram中不管聲明幾次,在幾個源文件中均表示同一個實體。(關(guān)鍵字extern) 例2:
typedef char *charPtr;static charPtr ch_a; //static聲明將外部鏈接轉(zhuǎn)為內(nèi)部鏈接extern int int_a; //聲明int_a在其他文件中定義,表示int_a是外部鏈接。int int_b; //外部鏈接,可以在外部源文件中用extern聲明。int fun_a(int int_c); //外部鏈接int main(void){ int int_d = 0; //無鏈接 { charPtr ch_c; //無鏈接 int int_e; //無鏈接 } fun_a(100); extern int int_f; //聲明int_f在其他文件中定義。 static int int_g; //無鏈接,因為static只對默認(rèn)為外部鏈接的變量有效。 return 0;}int fun_a(int int_c){ return int_c + 1;}1,靜態(tài)內(nèi)存。程序運行之前創(chuàng)建,程序運行過程中一直存在。并且始終保持原先的值。(用static修飾) 2,運行時堆棧。程序執(zhí)行到聲明變量的代碼時創(chuàng)建,離開代碼段時自行銷毀。 3,硬件寄存器。(register)提示對應(yīng)的變量應(yīng)該放在機(jī)器的寄存器當(dāng)中,而不是內(nèi)存中。與編譯器相關(guān),不一定能夠達(dá)到效果。 注:由于函數(shù)調(diào)用是實參是通過堆棧進(jìn)行傳遞的,故函數(shù)的形參不能聲明用static進(jìn)行修飾。
1,改變鏈接屬性:將變量由外部鏈接改為內(nèi)部鏈接,拒絕外部源文件使用該變量。如例2中的變量ch_a. 2,改變變量的存儲形式。變量存儲于靜態(tài)內(nèi)存。用于定義靜態(tài)變量。保證變量在程序運行的過程中一直存在,且只會被定義一次。 注:對于在.h中定義的文件作用域的static變量sa,每一個引用該頭文件的源文件都會有一個獨立的變量sa。
1,類靜態(tài)成員變量: 靜態(tài)成員是類所有實例的公用變量,可以理解為類的作用域內(nèi)的全局變量。同普通的static變量一樣,在程序初始化的時候分配一次,在程序運行期間一直存在。 2,類靜態(tài)成員函數(shù) 靜態(tài)函數(shù)是類所有實例的公用函數(shù),只能訪問類的靜態(tài)成員變量,通過類名::函數(shù)名方式調(diào)用。 3,對于類的靜態(tài)成員(包括變量和函數(shù))。在類的定義中只是聲明,必須在cpp中進(jìn)行初始化/實現(xiàn),初始化/實現(xiàn)時不需要static修飾。對于類的靜態(tài)成員變量程序會在啟動前(main()執(zhí)行前)進(jìn)行初始化。
新聞熱點
疑難解答