🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
クラスPointのメンバ関数宣言Point operator+(Point p);はoperator+関数のプロトタイプ宣言なのでoperator+関数の定義は後に行われます
クラスPointのメンバ関数宣言Point operator+(Point p);はoperator+関数のプロトタイプ宣言なのでoperator+関数の定義は後に行われます
ソーラー「
関数であるoperator+の💖クラスPointのメンバ関数宣言💖
Point operator+(Point p);
において
🌞operator+は関数名で🌞
関数operator+の右隣の(Point p)は
関数operator+の引数部分にあたり
関数operator+の左隣のPointは
関数operator+に戻り値が返された時の
戻り値を格納する型にあたるんだね。」
てんC「 ソーラーさん😊
お見事です」
マックス「int(イント) 俺達、食ってばかりだったな・・・」
int(イント)「モグモグ、うっ、すごいね。 さすがはソーラーさん」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
ずいぶん
『演算子のオーバーロード』の仕組みについて」理解がすすんでる!
🌞 🌞 🌞 🌞 🌞 🌞 🌞
ソーラー「そして・・・
関数であるoperator+の💖クラスPointのメンバ関数宣言💖
Point operator+(Point p);
において
🌞operator+は関数名で🌞
関数operator+の右隣の(Point p)は
関数operator+の引数部分にあたり
そして
関数operator+の左隣のPointは
関数operator+に戻り値が返された時の戻り値を格納する型にあたるのですが
もちろん
左隣のPointはクラスの型Pointです。
つまり
このoperator+関数はPoint型のオブジェクトを戻り値に持つんです。
なぜなら
クラスPointはクラスPoint型のオブジェクトを格納する型だからです。
そして
このoperator+関数はクラスPoint型のオブジェクトを引数としてもつことになります。
なぜなら
operator+関数の引数部分の()の中に
Point p
が設置されているからですね。
pのクラスPoint型のオブジェクト宣言
Point p
には
クラスPoint型のオブジェクトしか代入できないものね。」
マックス「ど~いう関数なんだ?
operator+は?
関数operator+は
クラスPoint型のオブジェクトを引数に持ち
クラスPoint型のオブジェクトを戻り値としてもつのか?」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
みんな~
まずは
関数であるoperator+の💖クラスPointのメンバ関数宣言💖
Point operator+(Point p);
の
左端のPoint
や
operator+(Point p)
の中の
Point p
は何を意味しているか
わかったかな
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「まあ
Point operator+(Point p);
をみて
何が記述されているか 全く分からないということは
なくなったが・・・
operator+のクラスPointのメンバ関数宣言
Point operator+(Point p);
は
結局なんなんだ・・・・?
・・・ううん」
int(イント)「ううん?」
マックス「むううう
Point operator+(Point p);
の意味は・・・」
ソーラー「それは・・・・
うう~ん
まいちゃったな・・・」
int(イント)「うう~ん?」
てんC「プロトタイプ宣言・・・」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
そう
このoperator+のクラスPointのメンバ関数宣言
Point operator+(Point p);
は
operator+関数のプロトタイプ宣言なんだ~
だから
この
operator+関数の定義は後に
Pointのクラス宣言の外で
行われることになります。
つまり
Point operator+(Point p);
を見ただけでは
関数operator+がどのような働きをするか
見極めることはできないんだyo~
🌞 🌞 🌞 🌞 🌞 🌞 🌞
ソーラー「ははっ yo~」
マックス「なるほど・・・
正直
『演算子のオーバーロード』の仕組み
は面白いな
なかなか
解読し甲斐があるな・・・」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
みなさ~ん
+演算子のオーバーロードが定義されているクラスPointと
operator+関数の定義
を
もう1度み・て・ね💖
きゃっ(⋈◍>◡<◍)。✧♡
👇
class Point{
public:
int x;
int y;
public:
void pointdisplay();
public:
Point operator+(Point p);
//🌞👆+演算子のオーバーロード宣言です🌞
//🌞かつ、関数operator+のクラスPointのメンバ関数宣言です🌞
/*🌞そしてPoint operator+(Point p);は関数operator+のプロトタイプ宣言でもあります🌞*/
};
void Point::pointdisplay() {
cout << x << "\n";
cout << y << "\n";
}
Point Point::operator+(Point p)
{
Point a;
a.x = x + p.x;
a.y = y + p.y;
return a;
}
/*👆🌞ここで クラスPointのメンバ関数operator+の定義が行われることになります。ですので
クラスPointのメンバ関数operator+がどのように機能するかはこの部分に記述されていることになります🌞*/
👆
Pointのクラス宣言内に
+演算子の新たな機能を追加するという
💖+演算子のオーバーロード宣言であるとともに💖
💖関数であるoperator+のクラスPointのメンバ関数宣言💖でもある
Point operator+(Point p);
が追加されていて
その
operator+関数の定義として
Point Point::operator+(Point p)
{
Point a;
a.x = x + p.x;
a.y = y + p.y;
return a;
}
が記述されていることに注目してね。
🌞 🌞 🌞 🌞 🌞 🌞 🌞
ソーラー「関数operator+の定義が
👇
Point Point::operator+(Point p)
{
Point a;
a.x = x + p.x;
a.y = y + p.y;
return a;
}
👆
で行われている・・・・・・・」
てんC「もしかして
+演算子の新たな定義を行うということは
クラスPointのメンバ関数operator+の定義をおこなうということなのですか?」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
わ~~~~~すごい
驚いた
そうなんだ あはっ
+演算子の新たな定義を行うということは
クラスPointのメンバ関数operator+の定義をおこなうということなんです。
この関数operator+を利用することにより
ふつうは実行できないオブジェクト同士の足し算
p1+p2;
を実行することができるようになるんです。
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「そこまで分かった!
ならば
次は
ついに
+演算子の新たな機能の追加定義
でもある
関数operator+の定義
👇
Point Point::operator+(Point p)
{
Point a;
a.x = x + p.x;
a.y = y + p.y;
return a;
}
の解読ってわけか
実は当初みたときから
全く理解できなかったんだ
だが
今ならいけそうだ」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます