对C++构造函数的认识

       学C++已经有一段时间了,但是对一些东西的理解任然停留在书本上,没有更深刻的认识。比如如题。
      曾有人问过我构造函数的作用是干什么的?回答很简单:“用来构造对象的”。于是满脑子就形成了这样
一种认识:一个对象只有在调用了构造函数以后,它所对应的内存块才有效。此思想存在了相当长的时间,
可以说直到写这篇文章前夕。我们在写构造函数时,如果构造函数形参和类成员变量同名,我们会用this
指针来加以区分。这从某种程度上已经暗示了调用构造函数时,类对象已经存在了。奈何思想顽固,对此
而不见。
    下面从汇编的角度来说明,对象其实在调用构造函数之前就已经存在了。
   
#include < iostream >
using   namespace  std;

class  A
{
public:
    A( )
    
{
        mem 
= 1;
    }
;
    
virtual ~A( )
    
{
        mem 
= 0;
    }
;
    
int mem;
}
;

int  main( )
{
    A gg;
    
return 0;
}
在主函数 A    gg;插入断点,运行,Alt + 8  ,查看底层的汇编代码。
   24:   A gg;
004038D8   lea         ecx,[ebp-8]
004038DB   call        @ILT+720(A::A) (004012d5)
25:     return 0;
004038E0   mov         dword ptr [ebp-0Ch],0
004038E7   lea         ecx,[ebp-8]
004038EA   call        @ILT+740(A::~A) (004012e9)
004038EF   mov         eax,dword ptr [ebp-0Ch]
26:   }
 首先对上面的汇编代码做以下说明:
 这是main函数中的一段代码,  24  , 25   ,   26分别对应着主函数中的A   gg、return 0、  }
 当调试停在004038D8指令上时,我们查看 &gg的值 为  0x0012FF78,说明对象已经存在了。
 也就是说构造函数只是类对象第一个调用的函数,而不是构造类对象内存块的家伙。
 至于对象gg的析构是在 return 0;后调用的,注意看指令 004038EA  调用了类的析构函数,不过
 掉了类的析构函数并不意味着对象对应的内存块就无效了!对象gg对应的内存块无效要等到 26以后。
这会在另一篇关于对析构函数的认识中说明。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值