2015-06-21 111 views
5

考慮一個變量由一個.cpp文件處理,而其他.cpp文件將該變量的值用於各種目的。兩個源文件(類和全局)之間的變量

當與類一起使用

// header.h 
class c { 
public: 
    static int f1(); 
    static int f2(); 
private: 
    static int v; 
}; 

// first.cpp 
int c::v(0); 

int c::f1() { return ++v; } 

// second.cpp 
int c::f2() { return ++v; } 

// main.cpp 
int main() { 
    cout << c::f1() << endl; 
    cout << c::f2() << endl; 
    return 0; 
} 

輸出是:

1 
2 

當在全局範圍內使用

// header.h 
int f1(); 
int f2(); 
static int v = 0; 

// first.cpp 
int f1() { return ++v; } 

// second.cpp 
int f2() { return ++v; } 

// main.cpp 
int main() { 
    cout << f1() << endl; 
    cout << f2() << endl; 
    return 0; 
} 

輸出是:

1 
1 

爲什麼當所述變量是一個類,輸出的是你期待什麼,否則就不是? (我知道的是,在第二部分使用extern會給想要的結果,問題是相當爲什麼static作品的情況下,與類別,但不能與全球範圍內?)

回答

6

static比在C單一的意義更加++ (語言設計者爲了減少保留關鍵字的數量,實際上做了很多事情)。

  • static在一個類意味着它是由類的所有實例共享的變量。

  • static在編譯單元中意味着它不能在不同的編譯單元中尋址。在這種情況下,您在標題中寫入了static;預處理器(通過``include`s)將其插入可編譯的源文件中。在包含這個頭文件的每個源文件中,它只是意味着這是一個本編譯單元的變量。

+0

我理解正確:每個文件都有自己的這個變量的副本嗎?所以,如果OP在哪裏把'f1()'和'f2()'放在同一個文件中,那麼他實際上會得到'1'和'2'作爲輸出?而且,如果他沒有將'v'聲明爲'static',那麼所有的文件都會共享這個變量,並且輸出將會是'1'和'2'? – dingalapadum

+0

@dingalapadum我完全同意第一部分。至於第二部分,並不完全 - 你原則上可能是對的,但在這種情況下,鏈接器會抱怨有多個定義的變量。 –

+0

我明白了。謝謝! – dingalapadum

1
  1. 關鍵字static,在class使用時,是指類的成員由所有它的實例共享。因此,每當vclass c中遞增時,它將返回一個大於先前值的值。

  2. 但是當在全局空間中使用關鍵字static時,與對象無關。全局空間中的static表示變量v可從該.cpp文件中進行訪問,該文件在其中被聲明/定義,並且在其文件中的文件爲#include d。無法從其他地方訪問。 OOP's中的static與非OOP中的static完全不同。