在我的 c++ 课程中,我编写了一个课程,并且我已经覆盖了加号运算符。
这是原型:
Var operator + (const Var& var);
为什么 IDE 告诉我这是正确的:
Var a = 3;
a + 5; // Correct
但这不是吗?
Var a = 3;
5 + a; // error
我需要做什么才能按此顺序将整数与我的对象相加?
原因是作为成员函数的运算符不是对称的。您在其中定义运算符的类的对象应始终位于左侧。
你需要的是 - 你应该把你的操作员函数放在课堂之外。
Var operator+(const Var&, const Var&);
如果您需要访问私有字段,请将其声明为友元函数。
我需要做什么才能按此顺序将整数与我的对象相加?
它需要是非会员:
Var operator + (const Var& var1, const Var & var2);
这允许将类型转换应用于任一操作数,而不仅仅是右手操作数。
如果它需要访问班级的私人信息,那么它也需要成为朋友。
对于后者,您需要一个免费功能
Var operator + (int, const Var& var);
另一种形式表明您的 Var 具有隐式转换,因此
Var operator + (const Var& lhs, const Var& rhs);
可能会更好。
请记住,成员函数永远不允许在 lhs 上进行转换。
当您将运算符重载为成员函数时,该运算符不是对称的。原因是在第一个参数上调用了重载操作。因此,如果您将+
运算符重载为成员函数并将其编写a1+a2
为a1.operator+(a2)
. 这意味着 a1 必须是该类的成员。
如果你想要对称功能,你应该在类外部实现它,如果它需要访问类的私有数据成员,请将其声明为friend
.
Var operator+(const Var& first, const Var& second);