2013-12-20 58 views
-1

我知道在c關鍵字有兩個用途:c和C++之間關鍵字static有什麼區別?

  • 修改變量

    • 修改全局變量

      這種用法的限制的全局變量範圍的範圍從定義的點文件的結尾。

    • 修改局部變量

      這種用法限於局部變量的範圍所定義的函數,但也保持在存儲器的靜態區域

  • 修改功能

    此意味着只能調用它定義的文件中的函數。

和在C++中,除了用法c,static也用於修改類的數據成員和函數成員。此用法限制屬於類的成員而不是類的對象。

我想知道在c/C++中還有其他用法static嗎?

+2

從哪裏知道那些'用法'? – exexzian

+0

@sansix e,從學習過程總結 – stamaimer

回答

5

static可能是在C和C++的最容易混淆的重載關鍵字。它在不同的地方意味着不同的事物。

  • 在功能,static存儲類,表示其中存在用於程序的生命週期的變量。所以說

    void f() { 
        static int i = 0; 
    } 
    

    說的i值將調用f()之間被保留。其他存儲類別是C11/C++ 11中默認的auto(但要注意C++ 11中含義的變化),externregister,以及thread_local

  • 在文件範圍(或C++中的命名空間範圍)中,static連接說明符。以這種方式標記爲static的功能和變量具有內部鏈接,並且對於當前翻譯單元也是局部的。這意味着,像

    static int f() { 
        return 3; 
    } 
    

    功能只能通過其他功能相同.c文件中引用。在C++ 03中不推薦使用static,而採用未命名的名稱空間。我在C++ 11中讀過一些不贊成的地方。

  • 在C++中,當應用於類的成員函數或成員變量時,這意味着該函數或變量不需要類實例即可被訪問。除了C++類訪問說明符適用於成員之外,「類靜態」成員函數/變量和全局函數/變量在實現方面幾乎沒有區別。

  • 一個最後一個:在C99(但不是C++),static可以數組函數參數中使用,像這樣:

    void f(int a[static 4]) { 
    } 
    

    此指定該參數a必須由大小的整陣列至少4.

我想這就是他們的全部,但是讓我知道如果有什麼我已經忘記的評論!

+0

無意中將此作爲一個社區維基,似乎無法撤消它,所以如果您有任何其他信息,請繼續並更新它。 –

+0

這涵蓋了在數據聲明(或至少所有的情況下)使用'static'我能想到)。關於函數的'static'(它也有不同的含義,取決於函數是在名稱空間還是在類的作用域)。 –

2

靜態在C語言系列中,靜態變量是在編譯單元(源文件或模塊)的整個生命週期中存在的靜態變量。靜態變量可以在模塊範圍內聲明,因此可以被同一個源文件中定義的所有函數訪問。這種靜態變量不能從其他模塊直接訪問,但內部模塊API可以將指針傳遞給靜態變量,並通過指針修改這些變量。靜態變量也可以在函數體內聲明,其中通用的作用域規則適用。在函數內聲明的靜態變量僅在模塊初始化時(通常在應用程序加載時)初始化,並通過調用包含該定義的函數的多個 保留其值。

在C++中,靜態變量也可以是類定義的成員。訪問靜態成員 變量受標準訪問修飾符(私有,公共,受保護)控制,但該類的所有實例共享相同的靜態變量,並共享相同的值。修改此變量的值 會影響該類的所有對象。易失性易失性關鍵字是全部不同的東西,並不以任何方式與靜態相反。一個靜態變量可能會或可能不會被聲明爲volatile,就像全局或局部變量 一樣。 volatile關鍵字是一個提示,通知編譯器,如果沒有編譯器的知識,變量的值 可能會改變。因此,編譯器的代碼優化器不能對變量的當前值做出假設 ,並且必須始終(重新)讀取變量的內容。

+0

請注意,成員也可以是成員函數,第二段忽略。另外,除了'volatile',一個靜態數據成員可以是'const'或'constexpr'。 – juanchopanza

0

參考C++ - >static關鍵字可以用來聲明變量,函數,類數據成員和類函數。

下面是在不同的場景中常見的用法(ref from MSDN

  • 當你聲明在文件範圍內的變量或函數(全局和/或命名空間範圍),static關鍵字指定變量或函數有內部聯繫。在聲明變量時,變量具有靜態持續時間,編譯器將其初始化爲0,除非指定另一個值。

  • 當你在一個函數中聲明一個變量時,static關鍵字指定變量保持它在該函數調用之間的狀態。

  • 當您在類聲明中聲明數據成員時,static關鍵字指定該成員的一個副本由該類的所有實例共享。靜態數據成員必須在文件範圍內定義。您聲明爲const static的完整數據成員可以有一個初始化程序。

  • 當您在類聲明中聲明成員函數時,static關鍵字指定該函數由該類的所有實例共享。靜態成員函數不能訪問實例成員,因爲該函數沒有隱式的指針。要訪問實例成員,請使用實例指針或引用的參數來聲明該函數。

  • 您無法將聯合的成員聲明爲靜態。但是,全局聲明的匿名聯合必須明確聲明爲靜態。

檢查還下列:
The static keyword and its various uses in C++

static keyword usage

+0

你在哪裏發現你不能將一個工會的成員聲明爲靜態的?標準似乎允許它。 –

+0

@JamesKanze不確定標準,但是在這裏編譯會給出錯誤http://ideone.com/hL2PLa – exexzian

+0

幾點:你應該首先擺脫所有其他錯誤(如缺少分號),並且你應該添加至少一個非靜態成員;我找不到任何說空洞的工會是非法的,但我無法想象它有任何用處。除此之外:它看起來像g ++在這裏有一個錯誤,因爲它顯然是合法的,其他編譯器接受它。 –

相關問題