2012-08-27 103 views
6

靜態關鍵字通常與內部鏈接有關,但類內使用的靜態關鍵字有外部鏈接權限?下面的變量m,n可以在類文件外部訪問。靜態關鍵字內部和外部

class c { 
    int i; 
    int j; 
    static int m; 
    static int n; 

    public: 
    void zap(); 
    static void clear(); 
}; 
+6

'static'成員屬於*類*;對於變量,它們可以在沒有對象的情況下訪問,並在實例中共享'struct Foo {static void * bar; static void * fu(); }',所以'Foo :: bar'和'Foo :: fu'是合法的。 – oldrinb

+0

這不是嚴格的標準要求,但可能(或可能不會!)不由自主的想到靜態成員爲在編譯時設置的固定地址的意義靜態的,而非靜態成員數據可以在棧上放或堆在各種運行時確定的地址。靜態成員基本上像全局變量,除了它們的標識符屬於聲明它們的類的範圍。 –

回答

10

沒錯。

關鍵字static在很大程度上超載太多不同的含義:

  • 論在命名空間範圍的變量或函數它賦予了名稱內部連接。
  • 在類成員上它使它成爲一個靜態成員,它不影響鏈接。
  • 對於函數範圍的變量,它給出了變量「靜態存儲持續時間」,而不是「自動」或「動態」存儲持續時間(即變量的生存期延長到程序末尾,如全局變量)。
+1

非類含義大多與在C:http://stackoverflow.com/questions/572547/what-does-static-mean-in-a-c-program –

1

可以說,靜態成員是類的成員,而不是任何特定的對象實例。也就是說,它們對於所有對象實例具有相同的值。

靜態成員函數雖然沒有值,但在其他方面是相同的。它們可以被視爲類的一部分,而不是每個對象實例都是唯一的。這意味着它們沒有this指針,並且無法訪問非靜態成員變量。

+1

成員函數通常不會被認爲具有*值*。 ;-) – oldrinb

2

正如我在my comment,static中所述,那些僅與類別相關聯的成員而不是單個對象。

static成員屬於;對於變量,它們可以在沒有對象的情況下訪問,並在實例中共享

struct Foo { 
    static void *bar; 
    static void *fu(); 
} 

所以Foo::barFoo::fu是合法的。

它們在C++ 03標準的§ 9.4中引入;

  1. 一類的數據或功能部件可以聲明在類定義static,在這種情況下,它是一個靜態成員的類的

  2. static構件X類的s可以被稱爲使用合格-ID表達X::s;沒有必要使用類成員訪問語法(5.2.5)來引用static成員。甲static構件可被稱爲使用類的成員訪問語法,在這種情況下對象表達式被評估

    class process { 
    public: 
        static void reschedule(); 
    }; 
    process& g(); 
    
    void f() 
    { 
        process::reschedule(); // OK: no object necessary 
        g().reschedule(); // g() is called 
    } 
    

    static構件可以直接在其類的範圍中或在範圍被稱爲從班級派生的班級(第10條);在這種情況下,static構件被稱爲是否使用了合格-ID表達,與嵌套名稱說明符的合格-ID命名從中static構件被引用類範圍的

    int g(); 
    struct X { 
        static int g(); 
    }; 
    struct Y : X { 
        static int i; 
    }; 
    int Y::i = g(); // equivalent to Y::g(); 
    

    ...