一:什么是靜態對象?
對象的存儲方式是靜態的。
局部靜態對象和類的靜態對象。
局部靜態對象:一個變量在函數內部定義,其生命周期跨越了該函數的多次調用。局部對象確保不遲於在程序執行流第
一次經過該對象的定義語句時進行初始化。這樣的對象一旦被創建,在程序結束之前都不會銷毀。在定義局部靜態對象的函數執行完畢后,該靜態對象不會撤銷。當該函數被多次調用的過程中,靜態局部對象會持續存在並保存它的值。
靜態成員對象:靜態成員對象存儲在全局存儲區,靜態成員對象的作用域在類的作用域中。其可以避免與其他類成員或全局對象名字沖突。可以封裝為私有的,而全局對象不可以。
二:定義及初始化
允許對構造類靜態局部量賦初值。若未賦以初值,則由系統自動賦值。數值型變量自動賦初值0,字符型變量賦空字符。
對基本類型的靜態局部變量若在說明時未賦以初值,則系統自動賦予0值。而對自動變量
不賦初值,則其值是不定的。
- 局部靜態對象:
int fun(int i)
{
static int a = 10;
a = a+i;
return a;
}
int main(int argc, char *argv[])
{
for(int i=0;i<3;i++)
{
cout <<fun(i)<<endl;
}
}

- 靜態類成員對象
聲明:類的靜態成員變量聲明前加static,其也遵守公有/私有訪問規則。 因為 static 成員不是任何對象的組成部分,所以不能通過構造進行初始化。應該單獨進行定義並進行初始化。
class Account {
public:
// interface functions here
void applyint() { amount += amount * interestRate; }
static double rate() { return interestRate; }
static void rate(double); // sets a new rate
private:
std::string owner;
double amount;
static double interestRate;
static double initRate();
};
這個類的每個對象具有兩個數據成員:owner 和 amount。對象沒有與static 數據成員對應的數據成員,但是,存在一個單獨的 interestRate 對象,由 Account 類型的全體對象共享。
static 數據成員必須在類定義體的外部定義(正好一次)。
不像普通數據成員,
static 成員不是通過類構造函數進行初始化,而是應該在定義時進行初始化。
定義:在函數定義的文件中進行定義,定義的格式:
類型名 類名::對象名=值;(前面不能再有static,
static 關鍵字只能用於類定義體內部的聲明中
)
double Account::interestRate = initRate();
這個語句定義名為 interestRate 的 static 對象,它是類 Account 的成
員,為 double 型。作用域符后面的表明都是在該類的作用域下,因此可以直接使用initRate()函數。注意,雖然initRate是私有的,我們也能用它初始化interestRate。和其他的成員一樣,interestRate的定義也可以在訪問類的私有成員。
訪問/調用:
在該變量所屬類的成員函數里直接可以使用,在其他文件中通過
類名::函數名/變量
三、全局靜態對象與全局變量的區別
全局變量前面加上static就變成了全局變量。全局變量本身就是靜態存儲方式,靜態全局變量也是靜態存儲方式。兩者的區別是,非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態全局變量在各個源文件中均可訪問。而靜態全局變量只有在定義該靜態全局變量的文件中可用,在同一源程序的其他源文件中不可訪問。因此可避免在其他源文件中的引起錯誤。
把局部變量變為靜態變量后,改變了其生命周期。把全局變量變為靜態全局變量,改變了其作用域,限制了其使用范圍。
四、應用
static成員變量最經典的用法就是設計模式中的
單例模式
了。在下篇文章中,我會指出單例模式的三種寫法,及其優缺點。