了解c++成员函数调用以及引用

来源:互联网 发布:gdi 矩阵变换 编辑:程序博客网 时间:2024/06/04 18:35

成员函数指针

我一直有点困惑在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指针传入。

具体关于成员函数指针的理解,这位博主讲的很详细,留着慢慢看吧
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

0 0