存儲類定義 C++ 程序中變量/函數的范圍(可見性)和生命周期。這些說明符放置在它們所修飾的類型之前。下面列出 C++ 程序中可用的存儲類:
- auto
- register
- static
- extern
- mutable
存儲類說明符可以分為兩個存儲類:自動存儲類(autmatic storage class)和靜態存儲類(static storage class)。關鍵字auto和regtster用來聲明自動存儲類變量。這種變量在進入聲明的塊時生成,在塊活動期間存在,在退出這個塊時刪除。
只有變量能作為自動存儲類。函數的局部變量和參數通常是自動存儲類。存儲類說明符auto顯式聲明變量為自動存儲類。例如,下列聲明表示float變量x和y是自動存儲類的局部變量,即只在定義該變量的函數體中存在:
auto float x,y;
局部變量默認為自動存儲類,因此關鍵字auto很少使用。
register聲明通常是不需要的。如今的優化編譯器通常能識別經常使用的變量,并決定將其教在寄存器中而不需要程序員進行register聲明。
關鍵字extern和static是用來聲明靜態存儲類變量和函數的標識符。這種變量從程序開始執行時就存在。對于變量,程序開始執行時就分配和初始化存儲空間;對于函數,從程序開始執行時就存在函數名。但是,盡管變量和函數名從程序開始執行時起就存在,但這并不是說這些標識符可以在整個程序中使用。
靜態存儲類有兩種標識符:外部標識符(如全局變量和函數名)與存儲類說明符Static中聲明的局部變量。全局變量和函數名默認為存儲類說明符extern。全局變量生成時將變量聲明放在任何函數定義之外.在整個程序執行期間保存該全局變量的值。全局變量和函數可以由文件中已聲明或定義的任何函數引用。
下面我們具體來看一下:
auto 存儲類
auto 存儲類是所有局部變量默認的存儲類。
{ int mount; auto int month;}
上面的實例定義了兩個帶有相同存儲類的變量,auto 只能用在函數內,即 auto 只能修飾局部變量。
register 存儲類
register 存儲類用于定義存儲在寄存器中而不是 RAM 中的局部變量。這意味著變量的最大尺寸等于寄存器的大?。ㄍǔJ且粋€詞),且不能對它應用一元的 '&' 運算符(因為它沒有內存位置)。
{ register int miles;}
寄存器只用于需要快速訪問的變量,比如計數器。還應注意的是,定義 'register' 并不意味著變量將被存儲在寄存器中,它意味著變量可能存儲在寄存器中,這取決于硬件和實現的限制。
static 存儲類
static 存儲類指示編譯器在程序的生命周期內保持局部變量的存在,而不需要在每次它進入和離開作用域時進行創建和銷毀。因此,使用 static 修飾局部變量可以在函數調用之間保持局部變量的值。
static 修飾符也可以應用于全局變量。當 static 修飾全局變量時,會使變量的作用域限制在聲明它的文件內。
在 C++ 中,當 static 用在類數據成員上時,會導致僅有一個該成員的副本被類的所有對象共享。
#include <iostream>// 函數聲明 void func(void);static int count = 10; /* 全局變量 */main(){ while(count--) { func(); } return 0;}// 函數定義void func( void ){ static int i = 5; // 局部靜態變量 i++; std::cout << "i is " << i ; std::cout << " and count is " << count << std::endl;}
當上面的代碼被編譯和執行時,它會產生下列結果:
i is 6 and count is 9i is 7 and count is 8i is 8 and count is 7i is 9 and count is 6i is 10 and count is 5i is 11 and count is 4i is 12 and count is 3i is 13 and count is 2i is 14 and count is 1i is 15 and count is 0
extern 存儲類
extern 存儲類用于提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。當您使用 'extern' 時,對于無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。
當您有多個文件且定義了一個可以在其他文件中使用的全局變量或函數時,可以在其他文件中使用 extern 來得到已定義的變量或函數的引用。可以這么理解,extern 是用來在另一個文件中聲明一個全局變量或函數。
extern 修飾符通常用于當有兩個或多個文件共享相同的全局變量或函數的時候,如下所示:
第一個文件:main.cpp
#include <iostream>int count ;extern void write_extern();main(){ count = 5; write_extern();}
第二個文件:support.cpp
#include <iostream>extern int count;void write_extern(void){ std::cout << "Count is " << count << std::endl;}
在這里,第二個文件中的 extern 關鍵字用于聲明已經在第一個文件 main.cpp 中定義的 count?,F在 ,編譯這兩個文件,如下所示:
$g++ main.cpp support.cpp -o write
這會產生 write 可執行程序,嘗試執行 write,它會產生下列結果:
$./write5
mutable 存儲類
mutable 說明符僅適用于類的對象,這將在本教程的最后進行講解。它允許對象的成員替代常量。也就是說,mutable 成員可以通過 const 成員函數修改。