运营商重载寻求概念

时间:2018-04-06 05:31:29

标签: c++

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)

如果不是为什么,为别人做什么?

3 个答案:

答案 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 + intint += int

但是,为了完整性,对于诸如A + B之类的操作,重载决策是

  1. A.operator+(B)
  2. operator+(A, B)
  3. 对于+=它是不同的,因为它是一个单独的运算符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+=。因为编译器不会自动生成*,/,-