程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ static關鍵字

C++ static關鍵字

編輯:關於C++

c++ static 關鍵字

 

 

static 是C++中很常用的修飾符,它被用來控制變量的存儲方式和可見性。

 

 

面向過程中的static

 

- 靜態全局變量

在全局變量前,加上關鍵字static,該變量就被定義成為一個靜態全局變量。

#include
usingnamespace std;
void fn();  //聲明函數
static int n;  //聲明靜態全局變量
void main()
{
    n=20;  //為n賦初值
    printf("%d",n);//輸出n的值
    fn();  //調用fn函數
}
void fn()
{
    n++;  //n的值自加一(n=n+1)
    printf("%d",n);  //輸出n的值
}

 

靜態全局變量的特點:未經初始化的靜態全局變量會被程序自動初始化為0(在函數體內聲明的自動變量的值是隨機的,除非它被顯式初始化,而在函數體外被聲明的自動變量也會被初始化為0); 靜態全局變量在聲明它的整個文件都是可見的,而在文件之外是不可見的;

 

    注意:全局變量和全局靜態變量的區別
  • 1)全局變量是不顯式用static修飾的全局變量,全局變量默認是有外部鏈接性的,作用域是整個工程,在一個文件內定義的全局變量,在另一個文件中,通過extern 全局變量名的聲明,就可以使用全局變量。
  • 2)全局靜態變量是顯式用static修飾的全局變量,作用域是聲明此變量所在的文件,其他的文件即使用extern聲明也不能使用。

    - 靜態局部變量

    #include
    void fn();
    void main()
    {
        fn();
        fn();
        fn();
    }
    void fn()
    {
        static int n=10;
        printf("%d",n);
        n++;
    }
    

     

    靜態局部變量解決問題:在函數體內定義了一個變量,每當程序運行到該語句時都會給該局部變量分配棧內存。但隨著程序退出函數體,系統就會收回棧內存,局部變量也相應失效。或者是需要在兩次調用之間對變量的值進行保存。

     

    有人會說,為什麼不用全局變涼呢?如果用全局變量,變量已經不再屬於函數本身了,不再僅受函數的控制,給程序的維護帶來不便。
    

     

    靜態局部變量正好可以解決這個問題。靜態局部變量保存在全局數據區,而不是保存在棧中,每次的值保持到下一次調用,直到下次賦新值。

     

    - 靜態函數

    #include
    static void fn();//聲明靜態函數
    void main()
    {
        fn();
    }
    void fn()//定義靜態函數
    {
        intn=10;
        printf("%d",n);
    }
    

     

    靜態函數和普通函數區別:它只能在聲明它的文件當中可見,不能被其它文件使用。其它文件中可以定義相同名字的函數,不會發生沖突;

     

     

    面向對象中的static

     

    -靜態數據成員

    在類內數據成員的聲明前加上關鍵字static,該數據成員就是類內的靜態數據成員。

    #include
    classMyclass
    {
        public:
        Myclass(inta,intb,intc);
        void GetSum();
        private:
        int a,b,c;
        static int Sum;//聲明靜態數據成員
    };
    intMyclass::Sum=0;//定義並初始化靜態數據成員
    
    Myclass::Myclass(inta,intb,intc)
    {
        this->a=a;
        this->b=b;
        this->c=c;
        Sum+=a+b+c;
    }
    voidMyclass::GetSum()
    {
        cout<<"Sum="<

     

    特點:不管這個類創建了多少個對象,其靜態成員在內存中只保留一份拷貝,這個拷貝為該類的所有對象共享。也就是說,靜態數據成員是該類的所有對象所共有的。對該類的多個對象來說,靜態數據成員只分配一次內存,供所有對象共 用。所以,靜態數據成員的值對每個對象都是一樣的,它的值可以更新;

     

     

    靜態數據成員和普通數據成員一樣遵從public,protected,private訪問規則;

     

     

    靜態成員兩個必不可少的部分:類內聲明、類外初始化

     

          靜態數據成員初始化與一般數據成員初始化不同。靜態數據成員初始化的格式為:
    
    <;數據類型><;類名>::<;靜態數據成員名>=<;值>
    

    類的靜態數據成員有兩種訪問形式:

    <;類對象名>.<;靜態數據成員名> 或 <;類類型名>::<;靜態數據成員名>
    
    

    - 靜態成員函數

    class Myclass
    {
      public : 
        Myclass(int a,int b,int c);
        static void GetSum(); // 聲明靜態成員函數
      private : int a, b, c;
        static int Sum; //聲明靜態數據成員
    }
    
    int Myclass::Sum=0; //定義並初始化靜態數據成員
    
    Myclass::Myclass(int a,int b,int c)
    {
       this->a = a;
       this->b = b;
       this->c = c;
       Sum += a + b + c; //非靜態成員函數可以訪問靜態數據成員
    }
    void Myclass::GetSum() //靜態成員函數的實現
    {
        // cout<

     

    靜態成員函數可以在類內定義。也可以在類內聲明,類外定義。當在類外定義時,不能再使用static關鍵字作為前綴

     

    • 調用方法

      -1 類名::靜態成員函數

      如上所示

       Myclass::GetSum();
      

      -2 對象.靜態成員函數

      如上所示

      M.GetSum();
      

       

      通過對象調用靜態成員函數需要注意:

       

       1、通過對象訪問靜態成員函數的前提條件為對象已經簡歷
       2、靜態成員函數的訪問權限同普通成員函數一樣
       3、靜態成員函數也可以省略參數、使用默認形參值、以及進行重載。
      

       

      靜態成員函數與普通成、成員函數在使用上的區別:由於靜態成員函數在類中只有一個拷貝,因此他訪問對象的成員要收到一些閒置:靜態成員函數可以直接訪問類中說明的靜態成員,但不能直接訪問類中的非靜態成員;如果要訪問非靜態成員,必須通過參數傳遞的方式得到相應的對象,再通過對象來訪問。還需要注意的是:由於靜態成員是獨立於對象存在,因此靜態成員沒有this指針。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved