在本文中,作者选择返回类型为类类型http://www.learncpp.com/cpp-tutorial/92-overloading-the-arithmetic-operators/ 强调文本,我们可以将返回类型更改为返回int,因为我想执行以下操作,我试过这个,它工作得很好,为什么作者做了返回类型??
#include <cstdlib>
#include <iostream>
using namespace std;
class Cents // defining new class
{
private:
int m_Cents;
int m_Cents2;
public:
Cents(int Cents=0, int Cents2=0) // default constructor
{
m_Cents=Cents;
m_Cents2=Cents2;
}
Cents(const Cents &c1) {m_Cents = c1.m_Cents;}
friend ostream& operator<<(ostream &out, Cents &c1); //Overloading << operator
friend int operator+(const Cents &c1, const Cents &c2); //Overloading + operator
};
ostream& operator<<(ostream &out, Cents &c1)
{
out << "(" << c1.m_Cents << " , " << c1.m_Cents2 << ")" << endl;
return out;
}
int operator+(const Cents &c1, const Cents &c2)
{
return ((c1.m_Cents + c2.m_Cents) + (c1.m_Cents2 + c2.m_Cents2 ));
}
int main(int argc, char *argv[])
{
Cents cCents(5, 6);
Cents bCents;
bCents = cCents;
cout << bCents << endl;
Cents gCents(cCents + bCents, 3);
cout << gCents << endl;
system ("PAUSE");
return 0;
}
答案 0 :(得分:10)
除了许多其他事情之外,要记住的一件事是,在相同类型的两个对象之间添加的结果始终是非常特定的类型。所以它可能适合你,但逻辑上它是不正确的。
其次,您无法执行嵌套的+
语句而不返回类类型。
例如,如果你想这样做。
Obj1 + Obj2 + Obj3 ;
您将收到编译时错误。
原因是+
运算符的重载函数应该返回相同类类型的值的结果。下面写的运算符也可以为函数调用编写如下。
Obj1 + Obj2 ;
相当于......
Obj1.operator+(Obj2) ;
对于嵌套添加操作,您可以这样做。
Obj1 + Obj2 + Obj3 ;
相当于....
(Obj1.operator+(Obj2)).operator+(Obj3) ;
|---------------------|
这里,这部分......
(Obj1.operator+(Obj2))
成为另一个临时类对象,使用Obj3
作为参数调用下一个方法。因此,如果您不从+
函数返回类对象,则此部分将是int
而不是对象。不会在该int或任何其他非类数据类型上调用+
函数。所以它会给你一个错误。
简而言之,建议始终通过Value从重载的+
函数返回一个对象。
答案 1 :(得分:2)
通常,添加的语义是当您添加给定类型的两个对象时,您希望结果对象具有相同的类型。
没有理由你不能做你想做的事情,但它是非标准加法语义的一个例子。