c++中類的成員函式和成員變數的儲存方式是不一樣的。比如定義物件是系統會為物件分配儲存空間,其中只為成員變數分配了儲存空間,而成員函式則存放在公共的**段中。如下圖所示:
因此可以看出,每個物件占用的儲存空間只是該物件的資料部分(虛函式指標和虛基類指標也屬於資料部分)所占用的儲存空間,而不包括成員函式所占用的儲存。
**如下,以下**的輸出結果是什麼?
class test
答案:輸出 in func1後,程式崩潰原因:function1是成員函式,存放在**段(.text),所以沒有例項化類的時候仍然可以呼叫。function2是虛函式,關係到虛函式表和虛函式指標,虛函式指標存放在例項化的物件中,所以,未例項化物件時,不存在虛函式指標,所以呼叫虛函式會報錯
inline函式:需要說明,不論成員函式在類內定義還是在類外定義,成員函式的**段都用同一種方式儲存。不要將成員函式的這種儲存方式和inline(內聯)函式的概念混淆。不要誤以為用inline宣告(或缺省為inline)的成員函式,其**段占用物件的儲存空間,而不用inline宣告的成員函式,其**段不占用物件的儲存空間。不論是否用inline宣告(或缺省為inline),成員函式的**段都不占用物件的儲存空間。用inline宣告的作用是在呼叫該函式時,將函式的**段複製插人到函式呼叫點,而若不用inline宣告,在呼叫該函式時,流程轉去函式**段的入口位址,在執行完該函式**段後,流程返回函式呼叫點。inline與成員函式是否占用物件的儲存空間無關,它們不屬於同乙個問題,不應搞混。
c++程式的記憶體格局通常分為四個區:全域性資料區(data area),**區(code area),棧區(stack area),堆區(heap area)(即自由儲存區)。
靜態成員函式和非靜態成員函式都是在類的定義時放在記憶體的**區的,因而可以說它們都是屬於類的,但是類為什麼只能直接呼叫靜態類成員函式,而非靜態類成員函式(即使函式沒有引數)只有類物件才能呼叫呢?原因是類的非靜態類成員函式其實都內含了乙個指向類物件的指標型引數(即this指標),因而只有類物件才能呼叫(此時this指標有實值)。上面的測試**中this的值是null,null也是乙個實值
C 靜態成員變數,靜態成員函式
資料成員可以分靜態變數 非靜態變數兩種.靜態成員 靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名 靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員.因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜...
成員變數和成員函式記憶體分配
在c 中,成員變數和成員函式分開儲存,只有非靜態成員變數才屬於類的物件上。非靜態成員函式,靜態成員函式,靜態成員變數占用的記憶體均不占用類的物件空間上。示例1 include include using namespace std class person 非靜態成員函式 不屬於類的物件上 stat...
C 類的成員變數和成員函式的問題
類是一種資料型別,該型別類似於普通的資料型別,但是又有別於普通的資料型別。類這種資料型別是乙個包含成員變數和成員函式的乙個集合。下面是student類的定義。例1 類可以包含成員變數和成員函式 class student 本例宣告了類student,並且在student類中宣告了四個成員變數 nam...