在我的电脑上运行以下程序
#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
的行为定义明确?)
谢谢!
答案 0 :(得分:5)
是否因为编译器将
operator+
视为函数调用(导致未指定的行为)?
是。但请注意,++a
之后评估b * b
并不重要,因为最后,正确添加了这两个,这符合运算符优先级规则。
没有作业的表达式相当于:
operator+(a.operator++(), operator*(b, b))
函数参数的评估顺序未指定,因此从技术上讲,++a
可以在b * b
之前进行评估,但也可以相反。
我是否可以始终将重载运算符视为一个函数(当
x = x++
为x
时,Int
的行为定义明确?)
是和否。如果Int
与&#34;正常&#34;相同运营商会做,然后没有(直到C ++ 17),因为这将是未定义的行为。但是,如果Int
在x
中没有更改x++
,那么就是。
答案 1 :(得分:1)
据我所知,前缀
++
的优先级高于二进制*
。
更高的优先级并不意味着在乘法运算符之前将调用前缀增量,但是参数的顺序与相应的操作绑定。