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

本文探讨了C++中成员函数指针的工作原理及调用方式,包括stdcall调用约定,并通过汇编代码展示了成员变量与指针的底层实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

成员函数指针

我一直有点困惑在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值