C++ 靜態對象


一:什么是靜態對象?
    對象的存儲方式是靜態的。
         局部靜態對象和類的靜態對象。
    
局部靜態對象:一個變量在函數內部定義,其生命周期跨越了該函數的多次調用。局部對象確保不遲於在程序執行流第 一次經過該對象的定義語句時進行初始化。這樣的對象一旦被創建,在程序結束之前都不會銷毀。在定義局部靜態對象的函數執行完畢后,該靜態對象不會撤銷。當該函數被多次調用的過程中,靜態局部對象會持續存在並保存它的值。

靜態成員對象:靜態成員對象存儲在全局存儲區,靜態成員對象的作用域在類的作用域中。其可以避免與其他類成員或全局對象名字沖突。可以封裝為私有的,而全局對象不可以。

二:定義及初始化
        允許對構造類靜態局部量賦初值。若未賦以初值,則由系統自動賦值。數值型變量自動賦初值0,字符型變量賦空字符。 對基本類型的靜態局部變量若在說明時未賦以初值,則系統自動賦予0值。而對自動變量 不賦初值,則其值是不定的。

  • 局部靜態對象:
   
   
   
           
  1. int fun(int i)
  2. {
  3. static int a = 10;
  4. a = a+i;
  5. return a;
  6. }
  7. int main(int argc, char *argv[])
  8. {
  9. for(int i=0;i<3;i++)
  10. {
  11. cout <<fun(i)<<endl;
  12. }
  13. }

  • 靜態類成員對象
聲明:類的靜態成員變量聲明前加static,其也遵守公有/私有訪問規則。 因為 static 成員不是任何對象的組成部分,所以不能通過構造進行初始化。應該單獨進行定義並進行初始化。
   
   
   
           
  1. class Account {
  2. public:
  3. // interface functions here
  4. void applyint() { amount += amount * interestRate; }
  5. static double rate() { return interestRate; }
  6. static void rate(double); // sets a new rate
  7. private:
  8. std::string owner;
  9. double amount;
  10. static double interestRate;
  11. static double initRate();
  12. };
    這個類的每個對象具有兩個數據成員:owner 和 amount。對象沒有與
    static 數據成員對應的數據成員,但是,存在一個單獨的 interestRate 對象,
    由 Account 類型的全體對象共享。
     static 數據成員必須在類定義體的外部定義(正好一次)。 不像普通數據成員, static 成員不是通過類構造函數進行初始化,而是應該在定義時進行初始化。

定義:在函數定義的文件中進行定義,定義的格式:  
              類型名  類名::對象名=值;(前面不能再有static, static 關鍵字只能用於類定義體內部的聲明中
    
    
    
            
  1. double Account::interestRate = initRate();
這個語句定義名為 interestRate 的 static 對象,它是類 Account 的成 員,為 double 型。作用域符后面的表明都是在該類的作用域下,因此可以直接使用initRate()函數。注意,雖然initRate是私有的,我們也能用它初始化interestRate。和其他的成員一樣,interestRate的定義也可以在訪問類的私有成員。
訪問/調用:
在該變量所屬類的成員函數里直接可以使用,在其他文件中通過
類名::函數名/變量

三、全局靜態對象與全局變量的區別
    全局變量前面加上static就變成了全局變量。全局變量本身就是靜態存儲方式,靜態全局變量也是靜態存儲方式。兩者的區別是,非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態全局變量在各個源文件中均可訪問。而靜態全局變量只有在定義該靜態全局變量的文件中可用,在同一源程序的其他源文件中不可訪問。因此可避免在其他源文件中的引起錯誤。
       把局部變量變為靜態變量后,改變了其生命周期。把全局變量變為靜態全局變量,改變了其作用域,限制了其使用范圍。

四、應用
       static成員變量最經典的用法就是設計模式中的 單例模式 了。在下篇文章中,我會指出單例模式的三種寫法,及其優缺點。


         





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM