Can';t逆算子序 我在C++上的课堂上,我写了一个类,我已经重写了加号运算符。< /P>

Can';t逆算子序 我在C++上的课堂上,我写了一个类,我已经重写了加号运算符。< /P>,c++,operators,C++,Operators,这是原型: Var operator + (const Var& var); 为什么IDE告诉我这是正确的: Var a = 3; a + 5; // Correct 但这不是吗 Var a = 3; 5 + a; // error 我需要做什么才能使一个整数与我的对象按此顺序求和?原因是作为成员函数的运算符是不对称的。在其中定义运算符的类的对象应始终位于左侧 你需要的是-你应该把你的操作符函数放在类之外 Var operator+(const Var&, con

这是原型:

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&, const Var&);
如果需要访问私有字段,请将其声明为友元函数

我需要做什么才能将一个整数与我的对象按此顺序求和

它必须是非成员:

Var operator + (const Var& var1, const Var & var2);
这允许将类型转换应用于任一操作数,而不仅仅是右侧操作数

如果它需要进入班级的私人空间,那么它也需要成为朋友

我需要做什么才能将一个整数与我的对象按此顺序求和

它必须是非成员:

Var operator + (const Var& var1, const Var & var2);
这允许将类型转换应用于任一操作数,而不仅仅是右侧操作数


如果它需要访问类的隐私,那么它还需要成为朋友。

对于后者,您需要一个免费函数

Var operator + (int, const Var& var);
另一种形式表明您的Var具有隐式转换,因此

Var operator + (const Var& lhs, const Var& rhs);
可能更好


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

对于后者,您需要一个自由函数

Var operator + (int, const Var& var);
另一种形式表明您的Var具有隐式转换,因此

Var operator + (const Var& lhs, const Var& rhs);
可能更好


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

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

Var operator+(const Var&, const Var&);
如果您想要对称功能,您应该在类之外实现它,如果它需要访问类的私有数据成员,则将其声明为
朋友


Var运算符+(常量Var&first,常量Var&second)

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

Var operator+(const Var&, const Var&);
如果您想要对称功能,您应该在类之外实现它,如果它需要访问类的私有数据成员,则将其声明为
朋友


Var运算符+(常量Var&first,常量Var&second)

--基本上,您需要一个自由函数
操作符+
--基本上,您需要一个自由函数
operator+
;并将其替换为:Var运算符+(const-Var&var1,const-Var&var2)?我需要在哪里声明覆盖?不在类声明中?@pava91:如果是朋友,则可以在类定义中;否则,在周围的名称空间中。仅在类定义上,如果它是恶魔?我无法将原型写入cpp文件中的类和函数:S@pava91:是的,如果你愿意,你可以这样做。需要在课堂上宣布一个朋友;这取决于您是在那里实现它,还是在外部实现它;并将其替换为:Var运算符+(const-Var&var1,const-Var&var2)?我需要在哪里声明覆盖?不在类声明中?@pava91:如果是朋友,则可以在类定义中;否则,在周围的名称空间中。仅在类定义上,如果它是恶魔?我无法将原型写入cpp文件中的类和函数:S@pava91:是的,如果你愿意,你可以这样做。需要在课堂上宣布一个朋友;这取决于你是在那里实施,还是在外面实施。