C 物件模型(五)

2021-05-23 16:04:08 字數 1457 閱讀 2742

第四章函式語義學

眾所周知的,在c++ 中,跟類相關的成員函式有三種,靜態函式、非靜態函式、虛函式。本章介紹了這幾種函式的**、用在何處、編譯器如何實現、及效率。

非靜態成員函式:

簡單的說,非靜態成員函式就是非成員函式中加入了乙個this 指標的引數(不需要其他更多的解釋了)。

書中還特意提到了名稱的特殊處理(name mangling )。

一般來說,對於乙個非靜態成員函式,name mangling 的處理後的函式名是:函式名+類名+引數名。加類名是為了區分多重繼承的相同名字的成員函式;而加引數名,則是區分函式過載。作者還特意提到返回值並不加入name mangling 。

如果僅僅是返回值不同的兩個成員函式,vc 編譯器會報錯:

error c2556: 'float __thiscall namemangling::x(void)' : overloaded function differs only by return type from 'void __thiscall namemangling::x(void)'

靜態成員函式:

這裡沒有什麼內容。作者著重介紹了靜態成員函式的**。靜態成員函式的主要特徵在於:沒有this 指標,由這個主要特徵,衍生出以下主要特徵:1、

不能直接訪問類中的非靜態成員;2、

不能宣告為const 、volatile 、virtrual ;3、

不需要經由類物件呼叫;(抄書)

虛擬成員函式:

說到虛擬成員函式,就必須談到多型。虛函式的產生就是為了滿足多型的需要(我是這麼理解的)。要把這個道理說清楚還真不容易,作者花了整整六頁,畫了很多圖表,舉了很多例子試圖將虛擬繼承將清楚。這裡我也嘗試一下,以更短的語言將最簡單虛擬繼承和多型將清楚。

先舉個最簡單的例子:

有乙個基類,

class point

;class point2d : public point

;對於這個最簡單的虛擬繼承鏈,假設有乙個表示式為:

ptr->point();

那麼,這個函式到底是指向哪個類的函式呢?c++ 又是如何實現的?本段就是解決這個問題。

在c++ 中,對於每乙個存在虛函式的類中,都會新增乙個指標vptr 。該vptr 指向的是該類的虛函式表。類的虛函式表中包含了類中所有的虛函式( 即使有純虛函式,也被包含在內,雖然基本上是不可能有呼叫的) 。如果該類中沒有虛函式,但是所繼承的基類中有同名虛函式,那麼該虛函式也會被放到類的虛函式表中。也就是說對於類point 和point2d 的物件,都有乙個自己的虛函式表。並且類中有vptr 指向這個表。

所以對於ptr->point() ,編譯器先通過ptr 找到該類物件的vptr ,根據函式名字又可以得到函式在虛函式表中的索引,進而找到該函式的執行**。如果point() 在虛函式表中的索引為2 ,則這個表示式可以寫為:

(*ptr->vptr[2])(ptr);

這樣,只需要在執行期知道ptr的型別,就可以呼叫合適的函式處理了。

c 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

簡單物件模型 乙個c 物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見...