#include <iostream>
using namespace std;

class Point{
private:
int x;
int y;
public:
Point(int a=0, int b=0){x=a; y=b;}
Point operator+(Point p);
};

Point Point::operator+(Point p)
{
Point tmp;
tmp.x = x + p.x; //この部分   
tmp.y = y + p.y;
return tmp;
}

int main()
{
Point p1(1, 2);
Point P2(3, 6);
p1 = p1 + p2;
}
-------------
のtmp.x = x + p.x;がなぜこうなるのか解りません。

p1 + p2;をするための前処理?なのは解るのですが。

このQ&Aに関連する人気のQ&A

A 回答 (2件)

p1 + p2 が、p1.operator+(p2) として実行されるのは、sssoheiさんの言う通りです。


この時 Point::operator+ 関数には、p1 のアドレスが暗黙に渡され、自動的に用意された this という名のポインタ変数に格納されます。そして p2 の値は仮引数の Point p に渡されます。
関数内にメンバ名だけで存在する x や y は、この thisポインタを暗黙に使って参照されます。

つまり実際には、次のような処理をしているのです。(あくまでイメージです。)

Point operator_plus(Point *this, Point p) {
  Point tmp;
  tmp.x = this->x + p.x;  /* p1のxメンバとp2のxメンバを足す */
  tmp.y = this->y + p.y;  /* p1のyメンバとp2のyメンバを足す */
  return tmp;
}
  :
p1 = operator_plus(&p1, p2);

結局それぞれのメンバ同士の足し算を行うわけですが、足し算結果は Point型でなければならないので、tmp という一時的に結果を格納する変数を作って、それを戻値として返すわけです。

質問されていることと違いましたら、補足をお願いします。
    • good
    • 0
この回答へのお礼

理解できました。ありがとうございました。

お礼日時:2002/02/07 19:37

「メンバ関数のオーバーロード」ではなく「演算子のオーバーロード」じゃないでしょうか^^;



たしか「p1 = p1 + p2;」というのは「p1 = p1.operator+(p2);」と言うように計算はずです。つまり、コンパイラが演算子を関数に読み替えているわけです。
# ちょっと怪しいです…^^;
そのようになっていることで、スムーズに問題が解決出来るわけです。
# 「p1 = p1 + p2 + p3;」であれば「p1 = p1.operator+(p2.operator+(p3));」という感じに

あと「return tmp;」というのは「tmp」のコピーを返しています。この様に、直接書き換えないのは「p1 = p2 + p3;」の様な時を考えてみてください。納得出来なかったら補足をお願いします。

EffectiveC++という良書(と評判です。私もそう思います)がありますので、良ければ読んでみてください。
# この項目は扱われていませんのであしからず^^;
    • good
    • 0
この回答へのお礼

ありがとうございました。本読んで見ます。

お礼日時:2002/02/07 19:38

このQ&Aに関連する最新のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ