瞭解c++成員函式呼叫以及引用
阿新 • • 發佈:2019-02-03
成員函式指標
我一直有點困惑在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 a;
a.*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