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();
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
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;
}