存儲類型定義了變量或函數(shù)的作用范圍及生命周期。這些說明符也聲明了他們的修改方式的類型。有如下幾種存儲類型:
auto存儲類型是所有局部變量的默認(rèn)存儲類型。
{
int mount;
auto int month;
}
上面的例子中定義了兩個相同存儲類型的變量,auto 僅能運用于函數(shù)內(nèi)的局部變量。
register 存儲類型用于定義存儲于寄存器中的變量而不是內(nèi)存中。這意味著該變量的最大尺寸將是寄存器的大?。ㄍǔJ且粋€字),并且不能使用 '&' 尋址運算符進行操作(因為它沒有內(nèi)存地址)。
{
register int miles;
}
register類型應(yīng)該僅應(yīng)用于需要快速訪問的變量,比如計數(shù)器。需要注意的是,定義 register 類型的變量并不意味著該變量一定就存儲在寄存器中,這僅僅意味著需要按照硬件以及具體實現(xiàn)的限制來判定到底是不是存儲在寄存器中。
static 存儲類型的變量意味著該變量將會從始至終地存活在程序的整個生命周期內(nèi),而不會隨著每次訪問到它所在的代碼塊時就建立該變量,離開代碼塊時就銷毀該變量。因此,局部變量靜態(tài)化可以使他們在函數(shù)調(diào)用時仍保有其值。
static 修飾符也可以應(yīng)用于全局變量。 當(dāng)全局變量使用該修飾符后, 該全局變量就被限制在其聲明的文件內(nèi)。
在 C++中,當(dāng) static 應(yīng)用于類的數(shù)據(jù)成員時,它所起到的作用是多個該類的成員變量都是指的同一個變量。
#include <iostream>
// Function declaration
void func(void);
static int count = 10; /* Global variable */
main()
{
while(count--)
{
func();
}
return 0;
}
// Function definition
void func( void )
{
static int i = 5; // local static variable
i++;
std::cout << "i is " << i ;
std::cout << " and count is " << count << std::endl;
}
當(dāng)上述代碼被編譯后執(zhí)行,其結(jié)果如下:
i is 6 and count is 9
i is 7 and count is 8
i is 8 and count is 7
i is 9 and count is 6
i is 10 and count is 5
i is 11 and count is 4
i is 12 and count is 3
i is 13 and count is 2
i is 14 and count is 1
i is 15 and count is 0
extern 存儲類型用于使全局變量的引用對所有程序文件可見。如果前面已經(jīng)定義了一個變量名,那么就不能再使用 extern 來聲明同一變量名的變量了。
當(dāng)你有多個程序文件且需要定義一個可以在其他文件用可以訪問到的變量或函數(shù)時,就可以在其他文件中使用 extern 聲明該變量或函數(shù)的引用。
extern 修飾符通常被應(yīng)用于多個文件中需要共享相同的全局變量或函數(shù)的情況。一個例子如下:
第一個文件: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 關(guān)鍵用于聲明 count 變量已經(jīng)在其他文件中定義了。按照下面的方式來編譯:
$g++ main.cpp support.cpp -o write
這樣會生出一個 write 可執(zhí)行文件,運行它并看他的結(jié)果:
$./write
5
mutable 修飾符應(yīng)用于類對象,將會在后續(xù)章節(jié)中詳細(xì)討論。它允許對象的成員可以覆蓋常量。也即是說,mutable 成員可以被 const 成員函數(shù)所修改。