无法反转运营商的订单

时间:2013-06-21 14:32:59

标签: c++ operators

在我的c ++课上,我写了一个类,我已经覆盖了加号运算符。

这是原型:

Var operator + (const Var& var);

为什么IDE告诉我这是正确的:

Var a = 3;
a + 5;  //  Correct

但这不是吗?

Var a  = 3;
5 + a;  //  error

我需要做什么可以在此订单上与我的对象求和一个整数?

4 个答案:

答案 0 :(得分:2)

原因是运算符作为成员函数不对称。您定义运算符的类的对象应始终位于左侧。

您需要的是 - 您应该将您的操作员功能置于课堂之外。

Var operator+(const Var&, const Var&);

如果您需要访问私有字段,请将其声明为友元函数。

答案 1 :(得分:1)

  

我需要做什么可以在此订单上与我的对象求和一个整数?

需要成为非会员:

Var operator + (const Var& var1, const Var & var2);

这允许将类型转换应用于任一操作数,而不仅仅是右操作数。

如果需要访问班级的私立,那么它也需要成为朋友。

答案 2 :(得分:1)

对于后者,你需要一个免费的功能

Var operator + (int, const Var& var);

另一种形式表明你的Var有隐式转换,所以

Var operator + (const Var& lhs, const Var& rhs);

可能会更好。

请记住,成员函数永远不允许转换lhs。

答案 3 :(得分:0)

将运算符作为成员函数重载时,运算符不对称。原因是在第一个参数上调用了重载的操作。因此,如果您将+运算符重载为成员函数并写入a1+a2,则转换为a1.operator+(a2)。这意味着a1必须是该类的成员。

如果你想要对称功能,你应该在类之外实现它,如果它需要访问类的私有数据成员,则将它声明为friend

Var operator+(const Var& first, const Var& second);