运算符重载要保证和内置运算符具有相同的含义, 才能保证不会误用
重载是不改变语法的,运算符是一个表达式,必须有值得。
回复1楼上 @dustpg 我说的重载 + 这样的操作符 测试了下 int main(int argc, char* argv[]) { class a { public: a(int i):m_i(i) {}; int m_i; a &operator + (a &T) {this->m_i += T.m_i; return *this;} }; a tom(2), joy(3); tom+joy; return 0; } a+b; 这样的话a值是肯定要改的 我的问题是重载时的返回值 两种怀况在汇编下比较了下 {this->m_i += T.m_i; /*return *this;*/ } //无返回值 00401040 8B 44 24 04 mov eax,dword ptr [esp+4] 00401044 8B 10 mov edx,dword ptr [eax] 00401046 8B 01 mov eax,dword ptr [ecx] 00401048 03 C2 add eax,edx 0040104A 89 01 mov dword ptr [ecx],eax 0040104C C2 04 00 ret 4 {this->m_i += T.m_i; return *this;} //有返回值 00401040 8B C1 mov eax,ecx 00401042 8B 4C 24 04 mov ecx,dword ptr [esp+4] 00401046 8B 11 mov edx,dword ptr [ecx] 00401048 8B 08 mov ecx,dword ptr [eax] 0040104A 03 CA add ecx,edx 0040104C 89 08 mov dword ptr [eax],ecx 0040104E C2 04 00 ret 4 两种情况基本一样 都是 取得 两个对象的值然后 相加 add ecx, edx 和 add eax,edx =5 然后 mov dword ptr [ecx],eax 和 mov dword ptr [eax],ecx是一样的功能 把相加结果存储到调用对象 这样看编译器对两种情况是相同处理的不知道这样理解对不对 QAQ
int a = 0, b = 1; int c = a + b;
int a = 0; (a += 1) += 1;
64,282
社区成员
250,470
社区内容
加载中
试试用AI创作助手写篇文章吧