第四章探討函數語義。C++ 支援三種成員函數:靜態、虛、非靜態。各自調用方式與作用不同,但內部運作機制值得深入理解。
成員函數用於封裝與隱藏資料,但效率是否較外部函數高?
// 外部函數
float magnitude3d(const Point3d* _this) { ... }
// 成員函數
float Point3d::magnitude3d() const { ... }
表面上成員函數直接存取成員,效率似乎較高。實際上編譯器將其轉換為外部函數:
this 指標參數。this->member。// 轉換後偽碼
magnitude3d__7Point3dFv(register Point3d* const this) {
return sqrt(this->_x * this->_x + this->_y * this->_y + this->_z * this->_z);
}
// 調用轉換
obj.magnitude3d() --> magnitude3d__7Point3dFv(&obj);
結論:兩者效率相同(兩個鐵球同時落地)。
this 指標。virtual、const、volatile。C++ 引入靜態成員函數解決:靜態資料成員需提供存取函數,但該函數不應綁定於對象。
虛函數實現執行期多態。模型:
Point* ptr = new Point3d;ptr->z() 時,編譯器透過 vptr 查找虛函數表中 z() 的固定索引位置,調用正確實體。pure_virtual_called()。單一繼承體系中,虛函數機制極高效。判斷類是否支援多態,只需檢查是否有虛函數。