1

在本文中作者选择返回类型为类类型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;
}
4

2 回答 2

10

除了许多其他事情之外,要记住的一件事是,在相同类型的两个对象之间进行加法的结果总是属于那种非常特定的类型。所以它可能对你有用,但在逻辑上它是不正确的。其次,您无法在+不返回类类型的情况下执行嵌套语句。例如,如果你想这样做。

Obj1 + Obj2 + Obj3 ;

你会得到一个编译时错误。原因是+operator 的重载函数应该按相同类类型的值返回结果。下面编写的运算符也可以为函数调用编写如下。

Obj1 + Obj2 ;

相当于...

Obj1.operator+(Obj2) ;

对于嵌套加法操作,您可以这样做。

Obj1 + Obj2 + Obj3 ;

这相当于....

(Obj1.operator+(Obj2)).operator+(Obj3) ;
|---------------------|                       

在这里,这部分...

(Obj1.operator+(Obj2))

成为另一个临时类对象,在其上调用下一个方法Obj3作为参数。所以如果你不从+函数返回类对象,这部分将是一个int而不是一个对象。该+函数不会在该 int 或任何其他非类数据类型上调用。所以它会给你一个错误。

简而言之,建议始终从重载+函数中按值返回对象。

于 2012-09-27T15:41:56.203 回答
2

一般来说,加法的语义是当您添加两个给定类型的对象时,您希望结果对象具有相同的类型。

你没有理由不能做你想做的事,但这是非标准加法语义的一个例子。

于 2012-09-27T15:42:32.333 回答