1. 程式人生 > >C++ 類中成員函式分析

C++ 類中成員函式分析

概述
之前對成員變數的分佈進行了整理,今天就對成員函式進行整理。

1、非靜態成員函式
C++的設計準則之一就是:非靜態成員函式至少和一般的非成員函式的執行效率相同。

為了實現上衣準則,編譯器會對非靜態成員函式進行改進,先看下面的例子:

float func(const Point3d* _this) { .... }

float Point3d::func() const { .... }
1
2
3
編譯器對會Point3d::func()做下面三個步驟的操作:

1、改寫函式func以安插一個額外的引數到成員函式中,使得此類物件可以被使用,這個額外的引數被稱為this指標。如下:

Point3d::func( Point3d*www.mhylpt.com  const this )
1
如果成員函式也是const,則為:

Point3d::func(www.meiwanyule.cn const Point3d* const this )
1
2、將每一個對 “非靜態成員的存取操作” 改為經由 this 指標來存取。

return sqrt( this->x * this->x + this->y * this->www.michenggw.com y + this->z * this->z )
1
3、將 成員函式 重新編寫成一個外部函式,此函式獨一無二。這個咱前面整理C++函式編碼規則時講過了,大概的意思是分為兩步:第一步是區分不同類中的同名函式,在函式後加類名資訊。第二部是為了類中的過載函式,再在後面加引數資訊。

2、靜態成員函式
靜態成員函式相當於只執行非靜態成員函式中的第三步。因為它不屬於單個物件,所以沒有this指標的概念。由於沒有this指標所以有以下特性:

不能夠直接存取其class中的非靜態成員
不能夠宣告為const、virtual、volatile
不是必須由類物件進行呼叫
3、虛擬函式
之前整理過C++ 虛擬函式原理,對於虛擬函式的呼叫可以分為三個過程:

編譯器產生虛擬函式表,定義類物件時,物件中產生vptr,指向虛擬函式表。
虛擬函式的呼叫,會從虛擬函式表中檢索出索引。
新增額外的引數,跟非靜態成員函式一樣,這個引數是this指標。
由於存在虛擬機制,所以顯示的呼叫虛擬函式是比較有效率的,但是這樣會喪失掉多型。

4、函式呼叫效率
對於靜態成員函式和非靜態成員函式,執行效率和非成員函式是一樣。

對於虛擬函式,因為增加了多型機制,需要動態檢索,所以效率會降低。

感謝大家,我是假裝很努力的YoungYangD(小羊)

參考資料:
《深度探索 C++物件模型》
---------------------