對於類的大小,我們發現類內成員函式並不存在於類的儲存空間。這引發了我們的思考,類中的函式成員儲存在什麼地方?資料成員每個物件會有乙份,函式成員會不會也是這樣呢?
#include
using
namespace std;
class
time
private
:int hour;
int minute;
int sec;};
intmain()
執行結果為;
我們前面已經驗證過:
乙個物件所佔的空間大小只取決於該物件中資料成員所佔的空間,而與函式成員無關。
#include
using
namespace std;
class
time
void
dis(
)private
:int hour;
int minute;
int sec;};
intmain()
執行結果為:
那麼類內函式既然不占用物件的大小,那麼到底儲存在**?有又幾份?
用類去建立物件時,系統會為每乙個物件分配儲存空間。如果乙個類包括了資料成員和函式成員,那麼要分別為資料成員和函式成員分配儲存空間。
按道理說,如果用同乙個類定義了 10 個物件,那麼就需要分別為 10 個物件的資料和函式分別分配儲存單元。
能否只用一段空間來存放這個共同的函式**段,在呼叫各物件的函式時,都去呼叫這個公用的函式**。
顯然,這樣做會大大節約儲存空間。c++編譯系統正是這樣做的,因此每個物件所占用的儲存空間只是該物件的資料成員所占用的儲存空間,而不包括函式成員所占用的儲存空間。
那麼這裡有個疑問,當物件呼叫公用函式時,如何確定訪問的成員是呼叫物件的成員呢?
所有的物件都呼叫共用的函式**段,如何保證訪問的是呼叫物件的成員呢?
為此,c++設定了 this 指標,物件在呼叫公用函式時,將物件的指標作為隱含引數傳入其內,從而保證了訪問的函式成員屬於呼叫者。
#include
using
namespace std;
class
time
void
dis(
)//void dis(time *p)
private
:int hour;
int minute;
int sec;};
intmain()
執行結果為:
this 指標作為隱式引數被傳入,這是編譯器層面完成的,上例中也可以顯式引數傳入,效果是一樣的,每乙個類內函式都有乙個隱式引數就是this指標,當然,顯示引數傳入是完全沒必要的,因為編譯器已經在底層實現。
類的成員函式只有乙份,在物件呼叫函式的過程中,傳入物件的位址,具體表現為this指標。
不論成員函式在類內定義還是在類外定義,成員函式的**段都用同一種方式儲存。
應當說明,常說的 「某某物件的成員函式」,是從邏輯的角度而言的,而成員函式的儲存方式,是從物理的角度而言的,二者是不矛盾的。類似於二維陣列是邏輯概念,而物理儲存是線性概念一樣。
c 類中資料成員和成員函式的儲存方式
我們都知道在例項化類得到物件時,系統會為類內的資料成員和成員函式分配儲存空間 但是如果我們用同乙個類例項化多個物件呢?那麼是不是系統要為每乙個物件中的成員函式分配儲存空間?實際上不是這樣的!當例項化類得到物件時系統只為物件的資料成員分配記憶體空間,而將類的成員函式放在另乙個公共的區域。所以,無論例項...
c 類成員函式
c 的兩大特色是多型和模板。其中多型是通過繼承和虛函式來實現的,其中虛函式是通過每個物件裡面的虛表來實現的。如果這個物件的類有虛函式,那麼這個類就有一張虛表,存的是每個虛函式的入口位址,而這個類的每個物件,都會有乙個4位元組的指標,指向這張虛表,這個就是虛指標。上面一段話很多人都知道,但是如果問普通...
c 類成員函式
類成員函式是類的乙個成員,它可以操作類的任意物件,可以訪問物件中的所有成員。定義類box,使用成員函式來訪問類的成員,而不是直接訪問這些類的成員 class box class box double box getvolume void 在這裡,需要強調一點,在 運算子之前必須使用類名。呼叫成員函式...