我的電腦關於C++運算符重載
#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
爲Int
時,會使x = x++
的行爲良好定義)?
謝謝!
優先級影響分組,而不是評估順序。是的,'++'具有高於*(用於乘法)的優先級,因此表達式'++ a + b * b'等於'(++ a)+(b * b)'。然而,'+'操作數的評估順序沒有指定,因此不能保證在'++ a'之前或之後評估'b * b'。 – Peter