#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;をするための前処理?なのは解るのですが。
No.1
- 回答日時:
「メンバ関数のオーバーロード」ではなく「演算子のオーバーロード」じゃないでしょうか^^;
たしか「p1 = p1 + p2;」というのは「p1 = p1.operator+(p2);」と言うように計算はずです。つまり、コンパイラが演算子を関数に読み替えているわけです。
# ちょっと怪しいです…^^;
そのようになっていることで、スムーズに問題が解決出来るわけです。
# 「p1 = p1 + p2 + p3;」であれば「p1 = p1.operator+(p2.operator+(p3));」という感じに
あと「return tmp;」というのは「tmp」のコピーを返しています。この様に、直接書き換えないのは「p1 = p2 + p3;」の様な時を考えてみてください。納得出来なかったら補足をお願いします。
EffectiveC++という良書(と評判です。私もそう思います)がありますので、良ければ読んでみてください。
# この項目は扱われていませんのであしからず^^;
No.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 という一時的に結果を格納する変数を作って、それを戻値として返すわけです。
質問されていることと違いましたら、補足をお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- 英語 "by a ~ 0.5 percentage point"が単数となる理由等について 2 2023/05/11 10:41
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- スーパー・コンビニ イオンカードで、レジでWAON POINTを使って支払いたい時、電子マネーWAONカードのように機械 1 2023/03/12 05:44
- ポイントサービス・マイル WAON POINTと、WAONポイントは、違うのですか。 2 2023/07/07 20:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ArduinoのジャイロモジュールMP...
-
mallocについて
-
C言語をコンパイルするとコンピ...
-
Windows Formアプリからコンソ...
-
大量のデータを読み込んで表示...
-
システムエンジニアの適正について
-
プログラミングの授業の課題です
-
C言語 列挙型(enum型)変数について
-
パイソン。If elseの挙動につい...
-
擬似コード 長さがmの配列でな...
-
プログラムを斜めに並べる
-
double型が正常に認識されてい...
-
gccを行ってもexeファイルが生...
-
プログラムが書けません。
-
C言語 配列と関数の練習問題
-
MACで動く実行ファイルをWindow...
-
int16_t の _t は何?
-
PC画面を録画するプログラムでd...
-
C言語階乗の総和を求める
-
Office Component Suite
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
gccを行ってもexeファイルが生...
-
あなたは、Excelはどうやって学...
-
WindowsのCapsLock(キャップス...
-
質問失礼します。 プログラム言...
-
double型が正常に認識されてい...
-
Notepad++の関数リスト表示でC...
-
どちのほうがすきですか?
-
Stuck
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
C言語の関数と配列に関する質問
-
C言語って古いですか?
-
Linuxでの開発環境構築や設定の...
-
Bitcoin、BTCはブロックチェー...
-
C++6.0でのresource.hについて
-
MACで動く実行ファイルをWindow...
-
C言語 列挙型(enum型)変数について
-
c言語
-
大量のデータを読み込んで表示...
-
こんなことてしますか??
おすすめ情報