+ C++运算符重载

+ operator overloading in C++

本文关键字:重载 运算符 C++      更新时间:2023-10-16

我有一个用例如果我有 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++运算符优先级和操作数计算规则适用。