2017-08-14 109 views
0

我是新的C++,我不完全理解靜態變量的概念。 我有一個類中的靜態變量。類中的靜態變量和內存分配及其使用

class FCCommunication : public OEMThread 
{ 
public: 
    FCCommunication(); 
    static bool MASTER; 
} 

我使用初始化我的代碼和分配內存到FCCommunication源文件中以下兩個語句

FCCommunication * FCObject = 0; 

FCObject = new FCCommunication(); 

現在我的問題是,如果我嘗試訪問MASTER變量會發生什麼在這樣完成對象和內存分配之前

if(FCCommunication::MASTER)// this gets called before dynamic memory allocation. 
{ 
//do something here. 
} 
+0

很多初學者的書籍和教程都將靜態成員變量描述爲*類成員變量*。這是因爲它們屬於*類*而不是該類的任何特定實例。這就是你需要分別定義靜態成員變量的原因。這又意味着您可以在創建任何實例之前使用靜態成員變量(或靜態成員函數)。 –

+0

所以如果我把它叫做這個FCObject-> MASTER而不是FCC通信:: MASTER會有什麼區別?它會破壞我的操作系統?考慮同樣的分配情況。 – SPandya

+0

您在使用受保護模式操作系統的現代系統上所做的任何操作都不會影響操作系統。並且使用特定的實例來訪問一個靜態成員是不尋常的,但不是無效的。 –

回答

2

靜態成員變量分配與靜態存儲時間任何其他非成員變量。這意味着它們最終會在程序啓動之前初始化的大量數據中,通常稱爲.bss.data,具體取決於initalizer是否爲零值。

因此,靜態成員變量實際上並未與類一起分配,您初始化的值由在執行其餘類之前執行的代碼執行設置。

這意味着無論該類的任何實例是否存在,都可以實際訪問靜態成員。你可以把它們看作「具有受限訪問和範圍的全局變量」,因爲這正是它們的原因。

這意味着你的代碼很好。

+0

謝謝,這非常有幫助。現在又有人懷疑如果實例不在那裏,並且變量非靜態?會發生什麼?我是否在請求內存泄漏? – SPandya

+0

@SPandya不確定你的意思。如果它不是靜態的,你將無法通過'FCCommunication ::'訪問它。 – Lundin

+0

我的意思是使用類對象。像FCObject-> MASTER,但實例沒有遇到過。 – SPandya

0

(類的)C++成員靜態變量屬於該類的所有實例,在該類的任何實例被初始化之前初始化。因此,您可以使用FCC通信:: MASTER和FCObject-> MASTER訪問那些沒有差異的靜態變量。

你應該小心的一件事是你必須分別定義這些靜態變量。這就是說,你必須做這樣的事情,外側的類定義:

bool FCCommunications::MASTER = false; 
0

靜態成員初始化時初始化爲零的成員初始化爲零... 換句話說,它們屬於公共池。 任何其他對象都可以訪問它。 範圍內是類 生命期是程序的生命週期。