运算符重载时到底发生了什么?【DEBUG】

int main(){
001C7B00  push        ebp  
001C7B01  mov         ebp,esp  
001C7B03  push        0FFFFFFFFh  
001C7B05  push        1C8AFBh  
001C7B0A  mov         eax,dword ptr fs:[00000000h]  
001C7B10  push        eax  
001C7B11  sub         esp,104h  
001C7B17  push        ebx  
001C7B18  push        esi  
001C7B19  push        edi  
001C7B1A  lea         edi,[ebp-110h]  
001C7B20  mov         ecx,41h  
001C7B25  mov         eax,0CCCCCCCCh  
001C7B2A  rep stos    dword ptr es:[edi]  
001C7B2C  mov         eax,dword ptr ds:[001CF0E0h]  
001C7B31  xor         eax,ebp  
001C7B33  push        eax  
001C7B34  lea         eax,[ebp-0Ch]  
001C7B37  mov         dword ptr fs:[00000000h],eax  
time time1 = time(10,3); 
001C7B3D  push        3   ;参数入栈,参数属于局部变量
001C7B3F  push        0Ah  
001C7B41  lea         ecx,[time1]   ; 用于初始化 this 指针,对象time1 的地址
001C7B44  call        time::time (01C14C4h)   ; 调用构造函数初始化初始化time 对象
001C7B49  mov         dword ptr [ebp-4],0  ; 这地方的作用 ?????????????????????????????????
time time2 = time(20,4);
001C7B50  push        4  
001C7B52  push        14h  
001C7B54  lea         ecx,[time2]  
001C7B57  call        time::time (01C14C4h)   ; 初始化 time 对象,和上面的作用一样
001C7B5C  mov         byte ptr [ebp-4],1  
std::cout << "time1:\n";
001C7B60  push        1CCC7Ch       ; 1CCC7Ch 是字符串 “time1:\n”的首地址,是重载运算符功能调用的参数
001C7B65  mov         eax,dword ptr ds:[001D0380h]  
001C7B6A  push        eax  
001C7B6B  call        std::operator<<<std::char_traits<char> > (01C14BAh)   ;调用实现重载运算符功能的代码
001C7B70  add         esp,8  
time1.show();

001C7B73  lea         ecx,[time1]   ; 将time1 对象的地址作为 参数(就是经常使用的 this),调用time 类的show方法显示数据,也说明了每一个对象都隐;含了一个this 指针,

; 如果没有this 指针,就无法找到对象本身了

001C7B76  call        time::show (01C14A6h)  
std::cout << "time2:\n";
001C7B7B  push        1CCC8Ch  
001C7B80  mov         eax,dword ptr ds:[001D0380h]  
001C7B85  push        eax  
001C7B86  call        std::operator<<<std::char_traits<char> > (01C14BAh)   
001C7B8B  add         esp,8  
time2.show();
001C7B8E  lea         ecx,[time2]  
001C7B91  call        time::show (01C14A6h)  
std::cout << "time1 + time2:\n";
001C7B96  push        1CCC94h  
std::cout << "time1 + time2:\n";
001C7B9B  mov         eax,dword ptr ds:[001D0380h]  
001C7BA0  push        eax   ;该参数的作用是什么?????????????????????????????????

001C7BA1  call        std::operator<<<std::char_traits<char> > (01C14BAh)  
001C7BA6  add         esp,8  
(time1+time2).show();
001C7BA9  lea         eax,[time2]  
001C7BAC  push        eax   ;获得time2对象的地址,将其入栈(main 的栈帧) ,time2 作为参数(tips:参数会压入栈帧里面)
001C7BAD  lea         ecx,[ebp-104h]  
001C7BB3  push        ecx  
001C7BB4  lea         ecx,[time1]   ; 获得time1 对象的地址,将其入栈(main 的栈帧),从右到左(time1<-----time2),time1 作为this 指针(tips:this 指针不会压入栈帧里面)
001C7BB7  call        time::operator+ (01C149Ch)   ;调用重载运算符的功能实现代码
001C7BBC  mov         dword ptr [ebp-10Ch],eax  
001C7BC2  mov         edx,dword ptr [ebp-10Ch]  
001C7BC8  mov         dword ptr [ebp-110h],edx  
001C7BCE  mov         byte ptr [ebp-4],2  
001C7BD2  mov         ecx,dword ptr [ebp-110h]  
001C7BD8  call        time::show (01C14A6h)  
001C7BDD  mov         byte ptr [ebp-4],1  
001C7BE1  lea         ecx,[ebp-104h]  
001C7BE7  call        time::~time (01C1497h)  
return 0;
001C7BEC  mov         dword ptr [ebp-0F4h],0  
001C7BF6  mov         byte ptr [ebp-4],0  
001C7BFA  lea         ecx,[time2]  
001C7BFD  call        time::~time (01C1497h)    ;time2 调用析构函数
001C7C02  mov         dword ptr [ebp-4],0FFFFFFFFh  
001C7C09  lea         ecx,[time1]   ;time1 调用析构函数
001C7C0C  call        time::~time (01C1497h)  
001C7C11  mov         eax,dword ptr [ebp-0F4h]  
}
001C7C17  push        edx  
001C7C18  mov         ecx,ebp  
001C7C1A  push        eax  
001C7C1B  lea         edx,ds:[1C7C48h]  
001C7C21  call        @_RTC_CheckStackVars@8 (01C1127h)  
001C7C26  pop         eax  
001C7C27  pop         edx  
001C7C28  mov         ecx,dword ptr [ebp-0Ch]  
001C7C2B  mov         dword ptr fs:[0],ecx  
001C7C32  pop         ecx  
001C7C33  pop         edi  
001C7C34  pop         esi  
001C7C35  pop         ebx  
001C7C36  add         esp,110h  
001C7C3C  cmp         ebp,esp  
001C7C3E  call        __RTC_CheckEsp (01C132Ah)  
001C7C43  mov         esp,ebp  
001C7C45  pop         ebp  

001C7C46  ret 


思考:1、从上述反汇编代码中可以看出,其实在发生了运算符重载时,也就是使用了一个函数调用,转到实现重载后的运算符功能的代码处执行指定的操作。从本质上讲,其实对于机器而言,并没有哪一条机器指令是实现类似于一般的算术运算(如+ - * / 运算),但是c++语言从语法上却能够让我们如做简单的算术似的来处理对象,是因为c++编译器根据重载运算符生成了实现重载运算符功能的机器码。

2、函数的返回值保存在哪里?(返回的值包括内置类型和构造类型, 如 int char float 结构类型 类 等等)

// source code

#include<iostream>
#ifndef TIME_H_
#define TIME_H_
	class time{
	private:
		int m_minutes;
		int m_hours;
	public:
		time operator+(const time & t) const{   // + 运算符重载
			time temp;
			temp.m_hours = t.m_hours + m_hours;
			temp.m_minutes = t.m_minutes + m_minutes;
			return temp;
		}
		void show() const{
			std::cout << "time : hourse  " << m_hours << ":" << m_minutes << std::endl;
			return;

		}
	time(int minutes = 0,int hours =0 ){
		m_minutes = minutes;
		m_hours = hours;
	}
	~time(){
	}
	};


#endif
	int main(){
		time time1 = time(10,3);
		time time2 = time(20,4);
		std::cout << "time1:\n";
		time1.show();
		std::cout << "time2:\n";
		time2.show();
		std::cout << "time1 + time2:\n";
		(time1+time2).show(); // time1对象 以time2 对象为参数调用 time1 对象的 operator+ 来实现+ 运算符重载的操作
		return 0;
	}


【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值