+ C++运算符重载
+ operator overloading in C++
我有一个用例如果我有 5 个类 A,B,C,D,E 及其实例为 A,B,C,D,E
如果有表达式a = b + c + d + e;
运算符 + 和运算符 = 的调用顺序是什么。还有创建的临时对象是什么。
你能帮帮我吗
a = b + c + d + e;
将首先计算 =
的 r.h.s 上的表达式,然后调用=
以将该结果分配给 l.h.s 上的变量。
r.h.s 上的表达式将从右到左计算。
检查运算符优先级。
另外,请注意,在这种情况下,临时的生成将取决于:
- 重载
+
运算符的实现 & - 正在使用的编译器
+
是左关联性的。 =
是正确的联想。顺序将是
-
d
+e
临时de
-
de
+c
使临时cde
.这是通过调用类C
的运算符来完成的,+
获取临时de
作为实例的任何类的参数。 -
cde
+b
使临时bcde
.这是通过调用类B
的运算符+
获取cde
类的参数来完成的。 bcde
的值分配给变量a
。
这里的临时是一般情况,这取决于你实际如何处理过载会发生什么。临时类左侧的类将使用该临时类作为参数进行调用,而不是相反。
虽然使用+
时评估从左到右,但实际计算则相反。
希望这不是家庭作业
http://en.cppreference.com/w/cpp/language/operator_precedence
+ precedence is higher than =
所以+第一,它从左到右阅读
然后 =,它从右到左读取
对于临时对象,对不起,我不知道。
没有序列点,因此唯一的约束是在运算符本身之前,必须计算运算符的参数叫。 在您的情况下:
a = b + c + d + e;
方法:
a = (((b + c) + d) + e);
它变成:
a.operator=( operator+( operator+( operator+( b, c ), d), e ) );
(我在这里假设operator=
是成员,正如标准,但该operator+
像往常一样是一个免费函数。
碰巧的是,在这个特定的表达式中,操作数依赖关系强加严格的命令。
至于临时的,就要看operator+
的实施情况了,但是为了给运算符提供通常的语义,有必要每个调用返回临时(而不是引用(。 在这种情况下,您将有 3 个临时,一旦从每个operator+
返回时创建,并在完整表达式的末尾全部销毁。
完整参考资料在这里。
首先从右到左执行加法。分配是最后一个执行的。根据优化,可能不会产生任何临时:
int x,y,z,k;
x = y = z = k = 3;
int l = x + y + z + k;
cout << l;
00401000 mov ecx,dword ptr [__imp_std::cout (402038h)]
00401006 push 0Ch
00401008 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (40203Ch)]
重载不会更改执行顺序。正常的C++运算符优先级和操作数计算规则适用。
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 在 myVector 类中重载运算符 + 时出错
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 如何在 cpp 中重载运算符 +=?
- C++ 如何重载 [] 运算符并进行函数调用
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 重载运算符有地址吗?
- 如何迭代重载运算符 [] 的类?
- 重载运算符与添加问题
- 模板基类中的重载运算符
- 如何调用用于重载运算符"<<"的 friend 函数?
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- 重载运算符<<采用谷歌 C++ 风格
- C++ 如何正确重载 + 运算符
- cout (<<) 重载运算符不打印减去的矩阵
- 如何在 c++ 中重载运算符 + 以便能够 whrite c_str = "smth" + c_str;
- 重载运算符*以获取对另一个类的实例的引用