class A{
..........
..........
};
int x;
A a;
x=a + x; // option 1
x=x + a; // option 2
x+=a; // option 3
对于所有选项1 2,&运算符是否会超载3会一样吗?即 int A :: operator +(int s)
如果不是为什么,为别人做什么?
答案 0 :(得分:2)
没有
这会拨打A::operator +(int)
或operator +(A, int)
:
x=a + x; // option 1
这会拨打operator +(int, A)
(int::operator +(A)
之内没有这样的内容):
x=x + a; // option 2
这会调用operator +=(int, A)
(但您最好先制作第一个参数A&
,而不仅仅是A
,否则您实际上无法写出工作{{1}运营商)。没有+=
:
int::operator +=(A)
他们称之为不同的运算符重载的原因是因为它们不同......不确定还有什么要告诉你。
答案 1 :(得分:1)
all 不需要运算符重载,因为您基本上执行int + int
或int += int
。
但是,为了完整性,对于诸如A + B
之类的操作,重载决策是
A.operator+(B)
operator+(A, B)
对于+=
它是不同的,因为它是一个单独的运算符operator+=
。它不能有任何非成员重载(没有赋值运算符可以),因此A += B
唯一可能的尝试是A.operator+=(B)
。
修改后,选项1仍为A.operator(x)
或operator+(A, x)
(如上所述)。
选项2不能有成员超载,因此唯一可行的变体是opetrator+(x, A)
或x + static_cast<int>(A)
。
选项3只能是x += static_cast<int>(A)
。
static_cast<int>(A)
选项将使用operator int
重载。如果不存在,那么这些替代方案是不可能的,并且在构建时会出现错误。
我也建议例如this operator overloading reference。当然,你读过a few good books。
答案 2 :(得分:0)
在您的示例中,如果您喜欢A::operator+(int s)
,则此重载不适用于x+a
,除非您定义类似operator int()
的类型转换。因为operator +
作为成员函数将具有隐式this
指针作为rhs
参数。
因此建议你将operator +
重载为非成员函数。如有必要,提供隐式类型转换,如operator int()
或{{1} };
一旦您决定重载A(int)
,建议同时提供operator+
,以及operator+=
。因为编译器不会自动生成*,/,-
。