static 和 no static Member function學習
阿新 • • 發佈:2017-08-12
iostream 詳細 pac mem ret span fcm 對數 signature
在C++中,各個編譯器的實現可能不一樣,可是對於no static Member function的處理還是有跡可循的。對於no static Member function的處理一般有下面幾個步驟:
以下是做實驗的一段代碼:
#include <iostream> using namespace std; typedef void (*p)(); class Object { public: static void s_fun_1() { cout << "static function 1\n"; } void fun_1() {cout << "no static function 1\n";} }; typedef void (Object::*p1)(); void do_fun(p p_) {(*p_)();} int main() { do_fun(Object::s_fun_1); Object obj; p1 p1_ = &Object::fun_1; (obj.*p1_)(); return 0; }
1.改寫函數的函數原型(signature),以為函數安插一個額外的參數,作為存取對象數據成員的一個通道,這個過程也就將Member變為了no Member,這個參數就是this指針。
比如 void Object::fun()轉化為void Object::fun(Object * const this);在成員函數中this指針是不可賦值的體如今這邊。
假設是 void Object::fun()則轉化為void Object::fun(const Object * const this);
2.對數據成員的使用通過提供的通道也就this指針完畢。
3.對函數名進行mangling,使它變為程序中唯一的詞匯。
對於NRV的實施也是在這個過程中,其在第一步提供了訪問通道同一時候為返回值提供了返回通道。
而對於static Member function的處理。沒有涉及到Class Object,由於其是類方法,不會使用到數據成員,不須要綁定到特定的對象。
上面的執行結果:
能夠看出對static Member function的處理,其的地址是一個普通的函數指針。我們能夠將它做個callback來使用。而對於nostatic Member function的須要詳細關系到class,調用時須要也就關聯到詳細的class Object。例如以下:
可是事實上。從上面可知,我們的fun_1沒有使用到Member data。那麽就能夠這樣:
這當然也是能夠執行的。
static 和 no static Member function學習