我有一個工作的代碼庫,它有一個名爲Tabs的類。這個類的所有方法和變量都被定義爲靜態的。我明白類的靜態成員是由該類的所有對象共享的。該類用於將某些類型的數據存儲爲集合。許多不同的文件使用成員函數Tabs :: find()和Tabs :: Insert(),而沒有實例化類Tabs的對象。我試圖理解這是如何工作的,以及這種編程技術被稱爲什麼。謝謝。訪問類的成員。這個類的對象從未實例化過。所有成員的類型都是靜態的
回答
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();
}
我會說這將是「過時」。它主要使用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
意味着它們具有靜態生命週期,因此結構隻影響名稱,而不會影響初始化或破壞等。
你不需要聲明變量'extern'嗎? –
@LuchianGrigore:就像其他任何一個全局一樣,你可以在沒有'extern'的地方定義它們,如果你想從其他TU使用它們,你可以在這些地方聲明它們是'extern'(通常通過聲明在標題中並在需要時包括它)。 –
這就是我的意思。 –
- 1. 類的所有成員都是對象類型
- 2. 訪問靜態成員類
- 3. 實例類的靜態成員
- 4. 初始化類的靜態常量成員,其中成員是私有類型?
- 5. 通過對象訪問類的靜態成員
- 6. 靜態函數訪問類的成員
- 7. 從靜態方法訪問類成員
- 8. 訪問模板類型實例成員
- 9. 多態:通過類文字或對象訪問靜態成員
- 10. 靜態方法不能訪問類的實例成員
- 11. 如何訪問靜態類,這是另一種靜態類中的成員
- 12. 通過對象實例訪問私有靜態成員
- 13. 靜態成員'過渡'不能用於'UIView'類型的實例
- 14. 想從非靜態類訪問靜態成員的非靜態子類的Java
- 15. 訪問本地對象的私有成員(同一類類型)
- 16. 創建實例化其他成員類的主類的對象
- 17. 懶惰實例化靜態類的成員會有好處嗎?
- 18. 類的靜態成員
- 19. C++類的靜態成員
- 20. C++類的靜態成員
- 21. 從成員struct的成員函數中訪問類的成員?
- 22. 靜態成員訪問比AS3中的實例成員慢嗎?
- 23. 靜態類成員
- 24. 無法通過嵌套類型訪問外部類型的非靜態成員
- 25. 避免「通過派生類型訪問類型的靜態成員」
- 26. 無法通過嵌套類型訪問外類型的非靜態成員
- 27. 實例化多態成員變量是合適的類型
- 28. EXC_BAD_ACCESS類別訪問靜態成員
- 29. 如何訪問靜態類成員?
- 30. 的Python類的靜態成員:通過實例
它被稱爲使用全局變量(包裝在一個靜態類中)。 – birryree