用汇编的眼光看c++(之算术符重载)

上传人:wt****50 文档编号:33200128 上传时间:2018-02-14 格式:DOC 页数:5 大小:78.50KB
返回 下载 相关 举报
用汇编的眼光看c++(之算术符重载)_第1页
第1页 / 共5页
用汇编的眼光看c++(之算术符重载)_第2页
第2页 / 共5页
用汇编的眼光看c++(之算术符重载)_第3页
第3页 / 共5页
用汇编的眼光看c++(之算术符重载)_第4页
第4页 / 共5页
用汇编的眼光看c++(之算术符重载)_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《用汇编的眼光看c++(之算术符重载)》由会员分享,可在线阅读,更多相关《用汇编的眼光看c++(之算术符重载)(5页珍藏版)》请在金锄头文库上搜索。

1、 软件英才网 软件行业驰名招聘网站有需要请联系我们用汇编的眼光看 C+(之算术符重载) 算术符重载是类的有一个特性,但是每个人使用的方法不一样。用的好,则事半功倍;但是如果不正确的使用,则会后患无穷。(1) 简单算术符介绍那什么是算术符重载呢?我们可以举个例子。一般来说,我们定义两个 int 类型的变量的话,我们就可应对这两个类型进行加、减、乘、除的操作,同时还能比较判断、打印、数组操作、*号操作等等。那么如果我们想自己定义的类也具有这样的属性,那我们应该怎么办呢?当然就要算术符重载了。首先,我们对基本 class 做一个定义:cpp view plaincopy class desk pub

2、lic: int price; desk(int value):price(value) desk() desk& operator+= (desk& d) this-price += d.price; return *this; ; 下面,可以用一个范例函数说明一下使用的方法:cpp view plaincopy 74: desk n(5); 0040126D push 5 0040126F lea ecx,ebp-10h 00401272 call ILT+0(desk:desk) (00401005) 00401277 mov dword ptr ebp-4,0 75: desk m(1

3、0); 0040127E push 0Ah 00401280 lea ecx,ebp-14h 00401283 call ILT+0(desk:desk) (00401005) 00401288 mov byte ptr ebp-4,1 76: n += m; 0040128C lea eax,ebp-14h 0040128F push eax 00401290 lea ecx,ebp-10h 00401293 call ILT+40(desk:operator+=) (0040102d) 77: 软件英才网 软件行业驰名招聘网站有需要请联系我们大家可以把重点放在76句上面,不过74、75句我

4、们也会稍微介绍一下: 74句: 创建 desk 类型的临时变量 n,调用构造函数75句: 创建 desk 类型的临时变量 m,调用构造函数76句: 两个 desk 类型的数据相加,但是在汇编的形式上面,我们发现编译器把这段代码解释成函数调用,也就是我们在上面定义的算术符重载函数。(2)new、free 重载在 C+里面,我们不光可以对普通的算术符进行重载处理,还能对 new、free 进行重载。通过重载 new、free,我们还可以加深对代码的认识,正确认识构造、析构、堆内存分配的原理。首先,我们对 new 和 delete 进行重载定义:cpp view plaincopy class de

5、sk public: int price; desk(int value):price(value) desk() void* operator new(size_t size) return malloc(size); void operator delete (void* pData) if(NULL != pData) free(pData); ; 那么使用呢?cpp view plaincopy 72: desk* d = new desk(10); 0040127D push 4 0040127F call ILT+65(desk:operator new) (00401046) 0

6、0401284 add esp,4 00401287 mov dword ptr ebp-18h,eax 0040128A mov dword ptr ebp-4,0 00401291 cmp dword ptr ebp-18h,0 00401295 je process+56h (004012a6) 00401297 push 0Ah 00401299 mov ecx,dword ptr ebp-18h 0040129C call ILT+5(desk:desk) (0040100a) 004012A1 mov dword ptr ebp-24h,eax 004012A4 jmp proce

7、ss+5Dh (004012ad) 004012A6 mov dword ptr ebp-24h,0 004012AD mov eax,dword ptr ebp-24h 004012B0 mov dword ptr ebp-14h,eax 软件英才网 软件行业驰名招聘网站有需要请联系我们 004012B3 mov dword ptr ebp-4,0FFFFFFFFh 004012BA mov ecx,dword ptr ebp-14h 004012BD mov dword ptr ebp-10h,ecx 73: delete d; 004012C0 mov edx,dword ptr ebp

8、-10h 004012C3 mov dword ptr ebp-20h,edx 004012C6 mov eax,dword ptr ebp-20h 004012C9 mov dword ptr ebp-1Ch,eax 004012CC cmp dword ptr ebp-1Ch,0 004012D0 je process+91h (004012e1) 004012D2 push 1 004012D4 mov ecx,dword ptr ebp-1Ch 004012D7 call ILT+0(desk:scalar deleting destructor) (00401005) 004012D

9、C mov dword ptr ebp-28h,eax 004012DF jmp process+98h (004012e8) 004012E1 mov dword ptr ebp-28h,0 74: 上面是一段普通的 new、delete 使用代码。但是我们发现,简单的一个语句,在汇编器看来,却需要做这么多的内容,这是为什么呢,我们不妨来自习看一看: 72句:汇编中有两个函数调用,一个是 new 调用,也就是我们重定义的 new 函数,一个是构造函数,最后的几行代码主要是把构造函数返回指针赋值给一些临时变量,可忽略73句:汇编中首先让指针和0进行了判断,然后调用了一个函数,似乎没有调用我们的

10、 delete 函数,我们可以跟进去看一下:cpp view plaincopy desk:scalar deleting destructor: 00401410 push ebp 00401411 mov ebp,esp 00401413 sub esp,44h 00401416 push ebx 00401417 push esi 00401418 push edi 00401419 push ecx 0040141A lea edi,ebp-44h 0040141D mov ecx,11h 00401422 mov eax,0CCCCCCCCh 00401427 rep stos dw

11、ord ptr edi 00401429 pop ecx 0040142A mov dword ptr ebp-4,ecx 0040142D mov ecx,dword ptr ebp-4 00401430 call ILT+75(desk:desk) (00401050) 软件英才网 软件行业驰名招聘网站有需要请联系我们 00401435 mov eax,dword ptr ebp+8 00401438 and eax,1 0040143B test eax,eax 0040143D je desk:scalar deleting destructor+3Bh (0040144b) 0040143F mov ecx,dword ptr ebp-4 00401442 push ecx 00401443 call ILT+80(desk:operator delete) (00401055) 00401448 add esp,4 0040144B mov eax,dword ptr ebp-4 0040144E pop edi 0040144F pop esi 00401450 pop ebx 00401451 add esp,44h 00401454 cmp ebp,esp 00401456 call _chkesp (004

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号