簡體   English   中英

為什么+運算符重載返回類型不是類類型的整數?

[英]Why does + operator overloading return type is class type not integer?

在本文中,作者選擇了返回類型為類類型http://www.learncpp.com/cpp-tutorial/92-overloading-the-arithmetic-operators/ 強調文字 ,我們是否可以將返回類型更改為int ,因為我想執行以下操作,所以我嘗試了一下,而且效果很好,為什么作者將返回類型設置為class?

#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;
}

除了許多其他事情,要記住的一件事是,在相同類型的兩個對象之間進行相加的結果始終是非常特定的類型。 因此它可能對您有用,但從邏輯上講這是不正確的。 其次,如果不返回類類型,則無法執行嵌套+語句。 例如,如果您想這樣做。

Obj1 + Obj2 + Obj3 ;

您將得到一個編譯時錯誤。 原因是+運算符的重載函數應按相同類類型的值返回結果。 下面編寫的運算符也可以如下編寫用於函數調用。

Obj1 + Obj2 ;

相當於...

Obj1.operator+(Obj2) ;

對於嵌套加法運算,您可以采用這種方式。

Obj1 + Obj2 + Obj3 ;

相當於...

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

在這里,這部分...

(Obj1.operator+(Obj2))

成為另一個臨時類對象,使用Obj3作為參數調用下一個方法。 因此,如果不從+函數返回類對象,則此部分將是int而不是對象。 +函數不會在該int或任何其他非類數據類型上調用。 這樣會給你一個錯誤。

簡而言之,建議始終從重載+函數中按值返回對象。

通常,加法的語義是當您添加給定類型的兩個對象時,您期望結果對象具有相同的類型。

沒有理由您不能做自己想做的事,但這是非標准加法語義的一個例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM