[原创]C++中临时对象的学习笔记
发表于:
2010-2-10 02:03
7257
在函数调用的时候,无论是参数为对象还是返回一个对象,都将产生一个临时对象。这个笔记就是为了学习这个临时对象的产生过程而写。
本代码的详细例子见实例代码Ex.01
Ok,先让我们定义一个类:
class CExample
{
public:
int m_nFirstNum;
int m_nSecNum;
int GetSum();
bool SetNum(int nFirst, int nSec);
CExample(){} // 空构造,不实现任何功能
virtual ~CExample(){} // 空析构
};
// 定义的函数实现部分
int CExample::GetSum()
{
return m_nFirstNum+m_nSecNum;
}
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
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
bool SetExpFun(CExample objExp)
{
g_objExp.SetNum(objExp.m_nFirstNum, objExp.m_nSecNum);
return true;
} SetExpFun(objExp1);
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: