歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++成員函數的存儲方式

C++成員函數的存儲方式

日期:2017/3/1 9:54:40   编辑:Linux編程

用類去定義對象時,系統會為每一個對象分配存儲空間。如果一個類包括了數據和函數,要分別為數據和函數的代碼分配存儲空間。

按理說,如果用同一個類定義了10個對象,那麼就需要分別為10個對象的數據和函數代碼分配存儲單元,如圖8.4所示。

圖8.4

能否只用一段空間來存放這個共同的函數代碼段,在調用各對象的函數時,都去調用這個公用的函數代碼。如圖8.5所示。

圖8.5

顯然,這樣做會大大節約存儲空間。C++編譯系統正是這樣做的,因此每個對象所占用的存儲空間只是該對象的數據部分所占用的存儲空間,而不包括函數代碼所占用的存儲空間。如果聲明了一個類:
class Time
{
public:
int hour;
int minute;
int sec;
void set( )
{
cin>>a>>b>>c;
}
};
可以用下面的語句來輸出該類對象所占用的字節數:
cout<<sizeof(Time)<<endl;
輸出的值是12。

這就證明了一個對象所占的空間大小只取決於該對象中數據成員所占的空間,而與成員函數無關。

函數代碼是存儲在對象空間之外的。如果對同一個類定義了10個對象,這些對象的成員函數對應的是同一個函數代碼段,而不是10個不同的函數代碼段。需要注意的是: 雖然調用不同對象的成員函數時都是執行同一段函數代碼,但是執行結果一般是不相同的。

不同的對象使用的是同一個函數代碼段,它怎麼能夠分別對不同對象中的數據進行操作呢?
原來C++為此專門設立了一個名為this的指針,用來指向不同的對象。需要說明:
不論成員函數在類內定義還是在類外定義,成員函數的代碼段都用同一種方式存儲。
不要將成員函數的這種存儲方式和inline(內置)函數的概念混淆。
應當說明: 常說的“某某對象的成員函數”,是從邏輯的角度而言的,而成員函數的存儲方式,是從物理的角度而言的,二者是不矛盾的。

Copyright © Linux教程網 All Rights Reserved