成员函数指针
我一直有点困惑在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指针传入。
具体关于成员函数指针的理解,这位博主讲的很详细,留着慢慢看吧
http://www.cnblogs.com/chaoguo1234/archive/2013/07/11/3185285.html
另外一个引用
教科书上总是会写那么几个别名,不占用地址空间,那到底是别名又是什么,不占用地址空间在计算机里面是怎么实现的?
带着疑问,我还是怀疑内部其实就是指针,只是外部的表现形式不一样,因为计算机中无非寸的是地址或值
写了一段小代码然后看汇编,果然,汇编一模一样
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
另外还有一个博主也对此进行了深入的探究
http://www.cnblogs.com/rollenholt/articles/1907408.html