2012-05-03 45 views
3

我有一個工作的代碼庫,它有一個名爲Tabs的類。這個類的所有方法和變量都被定義爲靜態的。我明白類的靜態成員是由該類的所有對象共享的。該類用於將某些類型的數據存儲爲集合。許多不同的文件使用成員函數Tabs :: find()和Tabs :: Insert(),而沒有實例化類Tabs的對象。我試圖理解這是如何工作的,以及這種編程技術被稱爲什麼。謝謝。訪問類的成員。這個類的對象從未實例化過。所有成員的類型都是靜態的

+2

它被稱爲使用全局變量(包裝在一個靜態類中)。 – birryree

回答

4

static數據成員在main進入之前被初始化,這就是訪問它們的原因。它們駐留在靜態存儲器中,而不是動態或自動的。

只有靜態成員的類與具有全局變量和函數類似,但組合在一起。這本身不是一種編程技術。它只是全局的。

//globals.h 
class Globals 
{ 
    static int x; 
public: 
    static int getX() {return x;} 
}; 

//globals.cpp 
#include "Globals.h" 
int Globals::x = 1; 

//main.cpp 
#include "Globals.h" 
//x is initialized before call to main 
int main() 
{ 
    int x = Globals::getX(); 
} 
2

我會說這將是「過時」。它主要使用class(或struct,視情況而定)來模擬namespace

class whatever { 
    static int a, b, c; 
    static double x, y, z; 
}; 

int whatever::a, whatever::b, whatever::c; 
double whatever::x, whatever::y, whatever::z; 

是幾乎一樣:

namespace whatever { 
    int a, b, c; 
    double x, y, z; 
} 

你可能只處理那些早已經被添加到語言namespace代碼。如果不是那麼古老,作者可能會或者可能有一些意圖保持對某些不支持namespace(正確)的編譯器的可移植性。

無論如何,你所擁有的是具有限定名稱的全局變量。即使它們在class/struct之內,static意味着它們具有靜態生命週期,因此結構隻影響名稱,而不會影響初始化或破壞等。

+0

你不需要聲明變量'extern'嗎? –

+0

@LuchianGrigore:就像其他任何一個全局一樣,你可以在沒有'extern'的地方定義它們,如果你想從其他TU使用它們,你可以在這些地方聲明它們是'extern'(通常通過聲明在標題中並在需要時包括它)。 –

+0

這就是我的意思。 –