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;