用類去定義物件時,系統會為每乙個物件分配儲存空間。如果乙個類包括了資料和函式,要分別為資料和函式的**分配儲存空間。
按理說,如果用同乙個類定義了10個物件,那麼就需要分別為10個物件的資料和函式**分配儲存單元,如圖8.4所示。
圖8.4
能否只用一段空間來存放這個共同的函式**段,在呼叫各物件的函式時,都去呼叫這個公用的函式**。如圖8.5所示。
圖8.5
顯然,這樣做會大大節約儲存空間。c++編譯系統正是這樣做的,因此每個物件所占用的儲存空間只是該物件的資料部分所占用的儲存空間,而不包括函式**所占用的儲存空間。如果宣告了乙個類:
class
time};
可以用下面的語句來輸出該類物件所占用的位元組數:
cout這就證明了乙個物件所佔的空間大小只取決於該物件中資料成員所佔的空間,而與成員函式無關。
函式**是儲存在物件空間之外的。如果對同乙個類定義了10個物件,這些物件的成員函式對應的是同乙個函式**段,而不是10個不同的函式**段。
需要注意的是,雖然呼叫不同物件的成員函式時都是執行同一段函式**,但是執行結果一般是不相同的。
不同的物件使用的是同乙個函式**段,它怎麼能夠分別對不同物件中的資料進行操作呢?
原來c++為此專門設立了乙個名為this的指標,用來指向不同的物件。需要說明:
不論成員函式在類內定義還是在類外定義,成員函式的**段都用同一種方式儲存。
不要將成員函式的這種儲存方式和inmne(內建)函式的概念混淆。不要誤以為用inline宣告(或缺省為inline)的成員函式,其**段占用物件的儲存空間,而不用 inline宣告的成員函式,其**段不占用物件的儲存空間。不論是否用inline宣告,成員函式的**段都不占用物件的儲存空間。用inline宣告的作用是在呼叫該函式時,將函式的**段複製插人到函式呼叫點,而若不用inline宣告,在呼叫該函式時,流程轉去函式**段的人口位址,在執行完該函式**段後,流程返回函式呼叫點。inline與成員函式是否占用物件的儲存空間無關,它們不屬同乙個問題,不應搞混。
應當說明,常說的「某某物件的成員函式」,是從邏輯的角度而言的,而成員函式的儲存方式,是從物理的角度而言的,二者是不矛盾的。
C 成員函式的儲存方式
用類去定義物件時,系統會為每乙個物件分配儲存空間。如果乙個類包括了資料和函式,要分別為資料和函式的 分配儲存空間。按理說,如果用同乙個類定義了10個物件,那麼就需要分別為10個物件的資料和函式 分配儲存單元,如圖8.4所示。圖8.4 能否只用一段空間來存放這個共同的函式 段,在呼叫各物件的函式時,都...
C 類成員函式的儲存方式 C 類成員
對於類的大小,我們發現類內成員函式並不存在於類的儲存空間。這引發了我們的思考,類中的函式成員儲存在什麼地方?資料成員每個物件會有乙份,函式成員會不會也是這樣呢?include using namespace std class time private int hour int minute int...
c 類中資料成員和成員函式的儲存方式
我們都知道在例項化類得到物件時,系統會為類內的資料成員和成員函式分配儲存空間 但是如果我們用同乙個類例項化多個物件呢?那麼是不是系統要為每乙個物件中的成員函式分配儲存空間?實際上不是這樣的!當例項化類得到物件時系統只為物件的資料成員分配記憶體空間,而將類的成員函式放在另乙個公共的區域。所以,無論例項...