1. 程式人生 > >static 和 no static Member function學習

static 和 no static Member function學習

iostream 詳細 pac mem ret span fcm 對數 signature

以下是做實驗的一段代碼:

#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;
}
在C++中,各個編譯器的實現可能不一樣,可是對於no static Member function的處理還是有跡可循的。對於no static Member function的處理一般有下面幾個步驟:

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學習