首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于+的运算符重载解决方案

2013-03-25 
关于+的运算符重载C++ Premer plus 第六版386页下方说道:+是从左向右结合的运算符,假如有一个叫做Time的类

关于+的运算符重载
C++ Premer plus 第六版386页下方说道:+是从左向右结合的运算符,假如有一个叫做Time的类,t1,t2,t3,t4都是Time类的对象,现将t1,t2,t3的值赋给t4,则有:
t4=t1+t2+t3;它等价于:
t4=t1.operator+(t2+t3);即:
t4=t1.operator+(t2.operator+(t3));
我想问的是:既然+是从左向右结合的运算符,那么也就是说:
t4=(t1+t2)+t3,那为什么不是:
t4=(t1.operator+(t2)).operator+(t3);

换种说法:假如我先定义了4个int 变量t1,t2,t3,t4;
t4=t1+t2+t3;不是应该先算t1+t2吗?为什么先算的是t1+(t2+t3);
[解决办法]
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的“实例复制”或“构造”或“作为参数”或“作为返回值返回”或“参加各种运算”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

[解决办法]


int a1 = 1;
0041272D  mov         dword ptr [a1],1 
int  a2 = 2;
00412734  mov         dword ptr [a2],2 
int a3 = 3;
0041273B  mov         dword ptr [a3],3 
int a4 = 0;
00412742  mov         dword ptr [a4],0 
a4 = a1 + a2 + a3;//此处设断点
00412749  mov         eax,dword ptr [a1] 
0041274C  add         eax,dword ptr [a2] 
0041274F  add         eax,dword ptr [a3] 
00412752  mov         dword ptr [a4],eax 

看上去就是1+2 =3  3+3 =6

热点排行