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

他の多くのこととは別に、覚えておくべきことの1つは、同じタイプの2つのオブジェクト間で行われる加算の結果は、常にその非常に特殊なタイプであるということです。だからそれはあなたのために働くかもしれませんが、論理的には正しくありません。+次に、クラスタイプを返さずにネストされたステートメントを実行することはできません。たとえば、これを実行したい場合。

Obj1 + Obj2 + Obj3 ;

コンパイル時エラーが発生します。その理由は、+演算子のオーバーロードされた関数は、同じクラスタイプの値で結果を返す必要があるためです。以下に記述されている演算子は、関数呼び出しに対して次のように記述されることもあります。

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

一般に、加算のセマンティクスは、特定のタイプの2つのオブジェクトを加算するときに、結果のオブジェクトが同じタイプであると期待することです。

やりたいことができない理由はありませんが、これは非標準の加算セマンティクスの例です。

于 2012-09-27T15:42:32.333 に答える