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

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

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


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


圖8.5

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

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

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

不同的對象使用的是同一個函數代碼段,它怎麼能夠分別對不同對象中的數據進行操作呢?

原來C++爲此專門設立了一個名爲this的指針,用來指向不同的對象。需要說明:
  1. 不論成員函數在類內定義還是在類外定義,成員函數的代碼段都用同一種方式存儲。
  2. 不要將成員函數的這種存儲方式和inMne(內置)函數的概念混淆。不要誤以爲用inline聲明(或默認爲inline)的成員函數,其代碼段佔用對象的存儲空間,而不用 inline聲明的成員函數,其代碼段不佔用對象的存儲空間。不論是否用inline聲明,成員函數的代碼段都不佔用對象的存儲空間。用inline聲明的作用是在調用該函數時,將函數的代碼段複製插人到函數調用點,而若不用inline聲明,在調用該函數時,流程轉去函數代碼段的人口地址,在執行完該函數代碼段後,流程返回函數調用點。inline與成員函數是否佔用對象的存儲空間無關,它們不屬同一個問題,不應搞混。
  3. 應當說明,常說的“某某對象的成員函數”,是從邏輯的角度而言的,而成員函數的存儲方式,是從物理的角度而言的,二者是不矛盾的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章