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