1. 程式人生 > >瞭解c++成員函式呼叫以及引用

瞭解c++成員函式呼叫以及引用

成員函式指標

我一直有點困惑在c++的類中並不包含成員函式,比如

class A{
    public:
    void a(){cout<<"a";}
    void b(){}
    void c(){}
};

sizeof(A)=1;
然後A A1;
A1.a/b/c()是可以工作的。

c++是如何找到成員函式的,那我想函式總應該有一個地址,通過取得一個函式的地址來呼叫函式?
定義函式指標

void (*ptr)()=&A::a;

完全是錯誤的,
才發現類成員函式的指標與c語言中的函式指標不一樣
這樣定義才行

void(A::*ptr)()
=&A::nonstatic;

然後這樣呼叫

A aa.*ptr()

成功執行了,不過還是沒明白,到底怎麼找到的,還有這種函式指標有什麼不一樣??
問過大神後,瞭解到有一種stdcall的呼叫方式,就是用來呼叫成員函式的,果斷嘗試

A tempa;
    __asm
    {
        lea ecx, tempa
        mov eax, A::a
        call eax
    }

果然也成功呼叫,第一句取得this指標,因為成員函式都隱含著將 this指標傳入。

另外一個引用

教科書上總是會寫那麼幾個別名,不佔用地址空間,那到底是別名又是什麼,不佔用地址空間在計算機裡面是怎麼實現的?
帶著疑問,我還是懷疑內部其實就是指標,只是外部的表現形式不一樣,因為計算機中無非寸的是地址或值
寫了一段小程式碼然後看彙編,果然,彙編一模一樣

    int a=4;
012E13D8  mov         dword ptr [a],4  
    int *c = &a;
012E13DF  lea         eax,[a]  
012E13E2  mov         dword ptr [c],eax  
    int &b = a;
012E13E5  lea         eax,[a]  
012E13E8  mov         dword ptr [b],eax  
    *c = 5;
012E13EB  mov         eax,dword ptr [c]  
012E13EE  mov         dword ptr [eax],5
b = 3; 012E13F4 mov eax,dword ptr [b] 012E13F7 mov dword ptr [eax],3 return 0; 012E13FD xor eax,eax