C++ 运算符重载(不清楚此运算符的确切名称)C++;

C++ 运算符重载(不清楚此运算符的确切名称)C++;,c++,C++,代码如下: #include <iostream> using namespace std; class X { public: int x; X(int x=6) : x{x} {} void print() {cout << x;} X operator+(int rop) const { return rop + x; } int operator+(const X& rop)const {

代码如下:

#include <iostream>
using namespace std;
class X {
public:
    int x;
    X(int x=6) : x{x} {}
    void print() {cout << x;}
    X operator+(int rop) const {
        return rop + x;
    }
    int operator+(const X& rop)const {
        return x+rop.x;
    }
};
X operator+(int lop, const X& x) {
    return 2*lop + x.x;
}
int main()
{
    X x;
    cout << (5+x) + (x+2);
    x.print();
    return 0;
}
#包括
使用名称空间std;
X类{
公众:
int x;
X(intx=6):X{X}{

void print(){cout您的运算符都不同:

一个用于
X+int
/
X.operator+(int)

下一个用于
X+X
/
X.operator+(X)

最后一个是
int+X
(必须是一个自由函数,因为无法重载
int.operator+
):


如果将运算符定义为类成员,则左操作数为类,右操作数为参数列表中的操作数。如:

X operator+(int rop) const;
在这里调用时,
int
应该是正确的操作数

如果它是在外部定义的,那么它只是按照正常的顺序,左边是第一个,右边是第二个


因此,对于
(5+x)
,类
x
中定义的运算符不能匹配,而类
x
外部定义的运算符不能匹配。

一般来说,
a+b
等于
a.operator+(b)
,如果
a
是一个具有重载
运算符+
成员函数的对象。否则编译器将尝试调用
运算符+(a,b)

对于
x+2
真正被调用的是
x.operator+(2)


使用
5+x
这是不可能的,因为不可能使用例如
5.operator+(x)
。而是必须使用全局函数。

当前是您的加法表达式

(5+x) + (x+2)
未经优化编译为

 x.X::operator+(2).X::operator+(operator+(5, x))
(至少在GCC 7.3中,我认为
5+x
x+2
的计算顺序可以根据编译器的不同而颠倒)

operator+(int-rop)
并不是绝对必要的。它用于(int-2)的第一次加法,因为它比通过构造函数的隐式转换将
int
转换为X更匹配。如果忽略
operator+(int-rop)
然后您将获得

X::X(x.X::operator+(X::X(2))).X::operator+(operator+(5, x))
在这两种优化情况下,这一切都简化为

std::cout << 24;
std::cout << 6;

std::cout因为这就是你告诉代码要做的事情吗?对于int+X操作数的顺序为important@UnholySheep我没有编写代码。这就是为什么我在问:)如果这不是你的代码,你应该说它来自哪里。写这段代码的人应该感到羞耻。
+
应该感到羞耻可交换。混合成员和非成员
+
有点不好,但返回类型使得
x+x+x+1
使用了3种不同的函数?恶心
 x.X::operator+(2).X::operator+(operator+(5, x))
X::X(x.X::operator+(X::X(2))).X::operator+(operator+(5, x))
std::cout << 24;
std::cout << 6;