为什么+运算符重载返回类型为类类型不是整数?(Why does + operator overloa

2019-10-17 06:18发布

在这篇文章中笔者选择了返回类型为类类型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;
}

Answer 1:

除了许多其他的事情,有一点要记住的是,除了采取相同类型的两个物体之间发生的结果是非常特殊的始终。 因此,它可能为你工作,但在逻辑上是不正确。 其次,你无法执行嵌套+有没有返回类的类型声明。 例如,如果你想这样做。

Obj1 + Obj2 + Obj3 ;

你会得到一个编译时错误。 其原因是,对于重载函数+操作者应用相同的类类型的值返回结果。 下面所写的运营商也对函数调用写入如下。

Obj1 + Obj2 ;

相当于...

Obj1.operator+(Obj2) ;

对于嵌套的加法运算,你这样做的方式。

Obj1 + Obj2 + Obj3 ;

这相当于....

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

在这里,这部分...

(Obj1.operator+(Obj2))

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

概括地说,最好是总是由值返回一个对象,从重载+功能。



Answer 2:

在一般情况下,另外的语义是:当你添加一个给定类型的两个对象,你期望得到的对象具有相同的类型。

没有理由,你想做什么,你不能这样做,但它是非标准除了语义的一个例子。



文章来源: Why does + operator overloading return type is class type not integer?