類中static變數和成員變數

2021-09-12 17:21:00 字數 1121 閱讀 1182

​  要理解標題,我們首先來看下static變數本身的特殊之處,即它儲存在全域性資料區。在類中的static變數也是如此。

c++的記憶體分布

**區 :函式體的二進位制**

全域性資料區:全域性變數和static變數

堆 :動態記憶體分配 -> 通過new

棧 :區域性變數

常量區 :字元/文字常量

這之後我們先通過**觀察一下區別是什麼。我定義了乙個test類,並在其中定義了乙個普通成員變數和乙個static變數,**如下。

​                  圖1-1

​   我定義的test類中定義了乙個普通成員變數和乙個static變數,執行該程式,結果如下。

​ 圖1-2

​  從圖1-2中可以發現類中的static變數沒有被分配空間,即static在類中只是宣告,而非定義。

​  最後,我們知道了結果,現在來理解一下。其實我們只要知道了static變數為什麼不能在類中定義,我們要知道定義乙個變數則一定會給其開闢乙個空間(即使不初始化、賦值也是如此),正如類中的普通成員變數,我仍以整型說明,當其被定義於類中時,就是表明此類需要乙個整型的空間,所以每建立乙個類物件時,就會給該物件相應的大小。

​  而正如開頭所說,static變數是儲存於全域性資料區的,與類物件(物件中包括成員變數)的儲存位置並不相同,所以在類中不是定義(不給其空間),這是根據事實解釋。更形象一點說,static變數相當於類的一種屬性,它是「」虛無縹緲「的,它針對的是類本身,而類中的定義則針對的是物件,所以不能在類中定義static變數,只是宣告這種屬性。

​  所以,在熟練之前,不妨這樣記憶:類中的定義服務於物件,類中的static變數服務於類,所以static變數應在外面定義。

既然靜態成員變數、函式(靜態成員函式沒有 this 指標)只能在類中宣告,而不能在類中定義,那麼它的初始化就理所應當在類外,這也同時說明若沒有初始化、定義,靜態成員變數、函式是不能直接使用的。並且,在類外定義、初始化時不再加 static 修飾符(語法規定)。

C 中static成員變數

1 static成員變數屬於類,不屬於某個具體的物件,即使建立多個物件,也只為static成員變數分配乙個記憶體 所有物件都是這個記憶體裡的statiic變數,如果對其做出修改也會影響到其他物件的使用 2 static成員變數必須在類外進行初始化 形如 type class name value i...

static 成員變數以及static成員函式

靜態成員變數必須在類外實現初始化。靜態資料成員儲存在靜態儲存區,在程式整個執行期間都存在。sizeof 類名student sizeof 物件名s1 為不包含靜態資料成員的記憶體大小。常用來解決計數問題 include using namespace std class student static...

Python類變數和成員變數

先上一段 class test x num 4 num 1 y 5 def init self,num self.num num defchange self,num test.num num test.x num 21 deftest self self.x 12 self.y 15 a test...