关于+的运算符重载
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