关于C ++重载运算符

时间:2017-08-06 08:42:45

标签: c++ operators

在我的电脑上运行以下程序

#include <iostream>

class Int {
public:
  Int(int x) : val{x} {}
  Int operator++() {
    std::cout << "Int::operator++()\n";
    return ++val;
  }
  friend Int operator+(Int a, Int b) {
    std::cout << "operator+(Int, Int)\n";
    return a.val + b.val;
  }
  friend Int operator*(Int a, Int b) {
    std::cout << "operator*(Int, Int)\n";
    return a.val * b.val;
  }

private:
  int val;
};

int main()
{
  Int a = 1, b = 2;
  b = ++a + b * b;
  return 0;
}

我得到了这个输出:

operator*(Int, Int)
Int::operator++()
operator+(Int, Int)

据我所知,前缀++的优先级高于二进制*。但是在上面显示的输出中,前缀++在二进制*之后被称为!是因为编译器将operator +视为函数调用(导致未指定的行为)?我是否可以将重载运算符视为一个函数(当x = x++x时,这会使Int的行为定义明确?)

谢谢!

2 个答案:

答案 0 :(得分:5)

  

是否因为编译器将operator+视为函数调用(导致未指定的行为)?

是。但请注意,++a之后评估b * b并不重要,因为最后,正确添加了这两个,这符合运算符优先级规则。

没有作业的表达式相当于:

operator+(a.operator++(), operator*(b, b))

函数参数的评估顺序未指定,因此从技术上讲,++a可以在b * b之前进行评估,但也可以相反。

  

我是否可以始终将重载运算符视为一个函数(当x = x++x时,Int的行为定义明确?)

是和否。如果Int与&#34;正常&#34;相同运营商会做,然后没有(直到C ++ 17),因为这将是未定义的行为。但是,如果Intx中没有更改x++,那么就是。

答案 1 :(得分:1)

  

据我所知,前缀++的优先级高于二进制*

更高的优先级并不意味着在乘法运算符之前将调用前缀增量,但是参数的顺序与相应的操作绑定。