在我的c ++课上,我写了一个类,我已经覆盖了加号运算符。
这是原型:
Var operator + (const Var& var);
为什么IDE告诉我这是正确的:
Var a = 3;
a + 5; // Correct
但这不是吗?
Var a = 3;
5 + a; // error
我需要做什么可以在此订单上与我的对象求和一个整数?
答案 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);