首页
社区
课程
招聘
7
[原创]C++中临时对象的学习笔记
发表于: 2010-2-10 02:03 7360

[原创]C++中临时对象的学习笔记

2010-2-10 02:03
7360

在函数调用的时候,无论是参数为对象还是返回一个对象,都将产生一个临时对象。这个笔记就是为了学习这个临时对象的产生过程而写。


    本代码的详细例子见实例代码Ex.01



      Ok,先让我们定义一个类:


1
2
3
4
5
6
7
8
9
10
11
12
class CExample 
{
public:
    int m_nFirstNum;
    int m_nSecNum;
 
    int GetSum();
    bool SetNum(int nFirst, int nSec);
    CExample(){}                // 空构造,不实现任何功能
    virtual ~CExample(){}           // 空析构
 
};


1
2
3
4
5
// 定义的函数实现部分
int CExample::GetSum()
{
    return m_nFirstNum+m_nSecNum;
}



先让我们看一下对象的创建过程


1
2
3
4
5
6
7
8
9
10
11
12
13
14
CExample objExp1;
//  00401393   lea         ecx,[ebp-18h]            //  第一个对象
//  00401396   call        @ILT+20(CExample::CExample)
//  0040139B   mov         dword ptr [ebp-4],0      用来统计当前对象个数
 
CExample objExp2;
//  004013A2   lea         ecx,[ebp-24h]            //  第二个对象
//  004013A5   call        @ILT+20(CExample::CExample)
//  004013AA   mov         byte ptr [ebp-4],1
 
CExample objExp3;
//  004013AE   lea         ecx,[ebp-30h]            //  第三个对象
//  004013B1   call        @ILT+20(CExample::CExample)
//  004013B6   mov         byte ptr [ebp-4],2


上面创建了三个对象,它们的过程都非常相似,将一个局部变量地址给了ECX寄存器,然后调用构造函数。


先让我们看看,构造函数都干啥了:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
12:   CExample::CExample()
13:   {
00401540   push        ebp
00401541   mov         ebp,esp
00401543   sub         esp,44h
00401546   push        ebx
00401547   push        esi
00401548   push        edi
00401549   push        ecx                                  // 保存寄存器环境
0040154A   lea         edi,[ebp-44h]
0040154D   mov         ecx,11h
00401552   mov         eax,0CCCCCCCCh
00401557   rep stos    dword ptr [edi]
00401559   pop         ecx                                   // 填充完CC以后,恢复ECX内容
0040155A   mov         dword ptr [ebp-4],ecx
0040155D   mov         eax,dword ptr [ebp-4]                     // 取到this指针
00401560   mov         dword ptr [eax],offset CExample::`vftable'   // 让this指针指向虚表
15:   }
00401566   mov         eax,dword ptr [ebp-4]
00401569   pop         edi
0040156A   pop         esi
0040156B   pop         ebx
0040156C   mov         esp,ebp
0040156E   pop         ebp
0040156F   ret



我们知道,我们再C代码中,实现的是空构造,没有添加任何功能,可是反汇编的时候,发现,函数应该有个参数(是this指针),定位虚表的时候,是又构造完成让this指向虚表的工作的。



1、        传递一个对象的过程:


1
2
3
4
5
bool SetExpFun(CExample objExp)
{
    g_objExp.SetNum(objExp.m_nFirstNum, objExp.m_nSecNum);
    return true;
}

       


这是我们样例程序中,一个对象作为参数的情况。我们编写如下的调用代码:


1
SetExpFun(objExp1);



        反汇编代码如下:



[注意]看雪招聘,专注安全领域的专业人才平台!

上传的附件:
收藏
免费 7
支持
分享
赞赏记录
参与人
雪币
留言
时间
Youlor
为你点赞~
2024-5-13 01:00
伟叔叔
为你点赞~
2024-1-14 00:04
QinBeast
为你点赞~
2024-1-9 04:59
shinratensei
为你点赞~
2024-1-3 01:34
PLEBFE
为你点赞~
2023-12-10 00:03
心游尘世外
为你点赞~
2023-11-25 00:59
飘零丶
为你点赞~
2023-11-16 00:16
最新回复 (2)
雪    币: 270
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
顶bester陈,看来培训的效果不错
2010-2-10 22:21
0
雪    币: 386
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
参加什么培训了啊?vxk那个?
2010-2-10 23:00
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册