- ベストアンサー
メンバ関数のオーバーロード
#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;をするための前処理?なのは解るのですが。
- みんなの回答 (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 という一時的に結果を格納する変数を作って、それを戻値として返すわけです。 質問されていることと違いましたら、補足をお願いします。
その他の回答 (1)
- sssohei
- ベストアンサー率33% (33/98)
「メンバ関数のオーバーロード」ではなく「演算子のオーバーロード」じゃないでしょうか^^; たしか「p1 = p1 + p2;」というのは「p1 = p1.operator+(p2);」と言うように計算はずです。つまり、コンパイラが演算子を関数に読み替えているわけです。 # ちょっと怪しいです…^^; そのようになっていることで、スムーズに問題が解決出来るわけです。 # 「p1 = p1 + p2 + p3;」であれば「p1 = p1.operator+(p2.operator+(p3));」という感じに あと「return tmp;」というのは「tmp」のコピーを返しています。この様に、直接書き換えないのは「p1 = p2 + p3;」の様な時を考えてみてください。納得出来なかったら補足をお願いします。 EffectiveC++という良書(と評判です。私もそう思います)がありますので、良ければ読んでみてください。 # この項目は扱われていませんのであしからず^^;
お礼
ありがとうございました。本読んで見ます。
お礼
理解できました。ありがとうございました。