0

在我的 c++ 课程中,我编写了一个课程,并且我已经覆盖了加号运算符。

这是原型:

Var operator + (const Var& var);

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

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

但这不是吗?

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

我需要做什么才能按此顺序将整数与我的对象相加?

4

4 回答 4

2

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

你需要的是 - 你应该把你的操作员函数放在课堂之外。

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

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

于 2013-06-21T14:36:11.647 回答
1

我需要做什么才能按此顺序将整数与我的对象相加?

它需要是非会员:

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

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

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

于 2013-06-21T14:36:11.900 回答
1

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

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

另一种形式表明您的 Var 具有隐式转换,因此

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

可能会更好。

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

于 2013-06-21T14:36:20.127 回答
0

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

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

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

于 2013-06-21T14:48:56.007 回答