オブジェクトp1,p2同士の足し算p1+p2;を普通の自作関数operator+関数を設定することにより実行してみます

マックス「はっ


もしかして


クラスPoint型の


オブジェクトp1

オブジェクトp2


同士の足し算


p1+p2;


を実行して


オブジェクトp1のメンバ変数

p1.x

p1.y


オブジェクトp2のメンバ変数

p2.x

p2.y

同士の足し算


p1.x+p2.x

p1.y+p2.y


ができるよう


自作関数operator+関数の定義を設定していた場合


p1+p2;


が実行されるとき


自動的に


自作関数operator+関数の定義内容が実行されるように


C++言語では設計されているのか?



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



            そうなんです


オブジェクトp1

オブジェクトp2


同士の足し算


p1+p2;


ができるよう


自作関数operator+関数の定義を設定していた場合


p1+p2;


が記述されていれば


自作関数operator+関数の定義内容が実行されることになります。


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「そうか


あとは


自作関数operator+の定義内容


どうするかだよな


う~ん


           そうだな


どうやって


クラスPoint型のオブジェクトp1

クラスPoint型のオブジェクトp2


同士の足し算


p1+p2;


を実行して


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y

同士の足し算


p1.x+p2.x

p1.y+p2.y


ができるよう


自作関数operator+関数の定義を設定するか・・・・う~ん?


う~ん 」       」


int(イント)「ううう~んんん」


ソーラー「多分


自作関数operator+関数の引数部分に


operator+(Point p,Point q)


のように


クラスPoint型のオブジェクト宣言

Point p

Point q


を設定して


自作関数operator+関数が


クラスPoint型のオブジェクトp1

クラスPoint型のオブジェクトp2



引数に


持つことができるようにする必要があるんじゃないかな?」


マックス「ううん?」


ソーラー「そう設定しておいて


あとは😊


こんな風に


自作関数operator+関数の定義を設定すればいいんじゃないかな

👇

Point operator+(Point p,Point q){


Point a;


a.x=p.x+q.x;

a.y=p.y+q.y;


return a;

}


マックス「ぬわにぃ


もう


クラスPoint型の


オブジェクトp1

オブジェクトp2


同士の足し算


p1+p2;


を実行したとき


オブジェクトp1のメンバ変数

p1.x

p1.y


オブジェクトp2のメンバ変数

p2.x

p2.y

同士の足し算


p1.x+p2.x

p1.y+p2.y


ができるよう


自作関数operator+の


定義を完成させたのか?」


int(イント)「ソーラー すっごぉ~いい」


ソーラー「ははっ


ほとんど


いままでやってきたことの真似なんだけどね。」


マックス「なんで


自作関数operator+関数の定義

👇

Point operator+(Point p,Point q){


Point a;


a.x=p.x+q.x;

a.y=p.y+q.y;


return a;

}

👆はこんな風になっているんだにゃ」


ソーラー「このように


自作関数operator+関数の定義を設定していると


p1+p2;


が実行されると


ひょっとして


operator+(p1,p2);


が実行されるんじゃないかな?っておもうんだ」


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞


そう、 わかっちゃった?


👇

Point operator+(Point p,Point q){


Point a;


a.x=p.x+q.x;

a.y=p.y+q.y;


return a;

}

👆


のように


自作関数operator+関数の定義が設定されていると


p1+p2;


が実行されると


operator+(p1,p2);


が実行されることになります


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞


マックス「


p1+p2;


が実行されると


p1.operator+(p2);


が実行されるんじゃなかったか?」



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞


よくあるある、そのお話で もちきりです 


p1+p2;


が実行されると


p1.operator+(p2);


が実行されるのは


operator+関数が


クラスPointのクラス宣言内で


クラスPointのメンバ関数宣言されていて


クラスPointのメンバ関数operator+関数


の定義が


たとえば


Point Point::operator+(Point p){


Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;

}

記述されているときだけ💖です


自作関数operator+関数の定義が

👇

Point operator+(Point p,Point q){


Point a;


a.x=p.x+q.x;

a.y=p.y+q.y;


return a;

}

👆のように設定されている場合は


p1+p2;


が実行されると


operator+(p1,p2);


が実行されることになります


ここがポイントかな うふふ


2つのoperator+関数は


1つは


クラスのメンバ関数で


1つは


クラスのメンバ関数でない普通の自作関数なの(⋈◍>◡<◍)。✧♡


クラスのメンバ関数operator+の定義には


      クラス名にスコープ解決演算子が付けられた


Point::


がもちいられているね



定義内容も違っているので


よく比べてみてね🌞



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



ソーラー「そう、やっぱりね🌞


p1+p2;


つまり


operator+(p1,p2);


が実行されると


自作関数operator+関数の定義

👇

Point operator+(Point p,Point q){


Point a;


a.x=p.x+q.x;

a.y=p.y+q.y;


return a;

}

👆

の定義内容


Point a;


a.x=p.x+q.x;

a.y=p.y+q.y;


return a;


が実行されるんだけど


そのとき


クラスPoint型のオブジェクト宣言


Point p;

Point q;

によって作製された



クラスPoint型のオブジェクトp

クラスPoint型のオブジェクトq

クラスPoint型のオブジェクトp1

クラスPoint型のオブジェクトp2


が代入された


Point a;


a.x=p1.x+p2.x;

a.y=p1.y+p2.y;


return a;


が実行されることになるよね」


マックス「


何で


aのオブジェクト宣言


Point a;


を実行しているんだ」


ソーラー「それも


今までやってきたことと同じことをやっているんだよ~


aのクラスPoint型のオブジェクト宣言


Point a;


を実行し


クラスPoint型のオブジェクトaの


メンバ変数


a.x

a.y


を生成しておけば


a.x

a.y


p1.x+p2.x;

p1.y+p2.y;



代入することができます。


後は


return a;


により


クラスPoint型のオブジェクトaを


operator+(p1,p2)


に戻り値として戻すんだよね。


そのために


自作関数operator+の定義

👇


Point operator+(Point p,Point q){


Point a;


a.x=p.x+q.x;

a.y=p.y+q.y;


return a;

}



Point operator+(Point p,Point q)

👆 👆 👆


自作関数operator+の戻り値を格納する型を


クラスPoint型に設定したんだよ


このようにしておけば


クラスPoint型のオブジェクトaを


operator+(p1,p2)


に戻り値として返すことができるよね😊


このとき


operator+(p1,p2)は


クラスPoint型のオブジェクトに相当するものになり


operator+(p1,p2)のメンバ変数


operator+(p1,p2).x

operator+(p1,p2).y

相当するものに

p1.x+p2.x

p1.y+p2.y


が代入されることになります


となると


クラスPoint型のオブジェクト宣言


Point p3;


によって


作製した


クラスPoint型のオブジェクトp3に


クラスPoint型のオブジェクトといえるoperator+(p1,p2)

p3=operator+(p1,p2);


と代入されたとき



クラスPoint型のオブジェクトp3のメンバ変数


p3.x

p3.y


クラスPoint型のオブジェクトoperator+(p1,p2)のメンバ変数


operator+(p1,p2).x

operator+(p1,p2).y

に相当するものが代入される


結果的には


p1.x+p2.x

p1.y+p2.y


が代入されることになります


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y

1

1

が代入されていて


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y

2

2

が代入されていれば


クラスPoint型のオブジェクトp3のメンバ変数


p3.x

p3.y


3

3

が代入されることになります


あとは


p3.pointdisplay();


を実行すれば


コマンドプロンプト画面に


3

3


が表示されるというわけです。


このように


自作関数operator+の定義を設定することにより


クラスPoint型の


オブジェクトp1

オブジェクトp2


同士の足し算


p1+p2;


を実行して


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y

同士の足し算


p1.x+p2.x

p1.y+p2.y



実行できるようになるというわけです😊」


そのときのプログラムはこちらです。

👇


#include <iostream>


using namespace std;


class Point{


public:

int x;

int y;


public:


public:


void pointdisplay();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";

}



Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}


int main() {


Point p1;

p1.x = 1;

p1.y = 1;

p1.pointdisplay();


Point p2;

p2.x = 2;

p2.y = 2;

p2.pointdisplay();


Point p3;

p3=p1+p2;

//🌞p3=operator+(p1,p2);と記述してもOKです🌞


p3.pointdisplay();


return 0;

}


プログラムの実行結果


1

1

2

2

3

3


ソーラー「このプログラムでは


Point p1;

p1.x = 1;

p1.y = 1;

p1.pointdisplay();


により


クラスPoint型のオブジェクトp1を生成し


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y

1

1

代入し

1

1

コマンドプロンプト画面に


表示しています。



次に

Point p2;

p2.x = 2;

p2.y = 2;

p2.pointdisplay();


により


クラスPoint型のオブジェクトp2を生成し


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y


2

2


を代入しコマンドプロンプト画面に


2

2

表示しています


次に


Point p3;


を実行し


クラスPoint型のオブジェクトp3を作製しています


次に

p3=p1+p2;


が実行されると


p3=operator+(p1,p2);


が実行されることになります。


p1+p2;

operator+(p1,p2);

等しいというわけです


すると


自作関数operator+(Point p, Point q)の定義

👇


Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}

の定義内容


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;



p.xにp1.x

p.yにp1.y


q.xにp2.x

q.yにp2.y


が代入された


a.x = p1.x + p2.x;

a.y = p1.y + p2.y;


が実行されることになります


次に


return a;


が実行されると



operator+(p1,p2)には


戻り値として


クラスPoint型のオブジェクトaが返されることになります。


このとき


クラスPoint型のオブジェクトaのメンバ変数

a.x


クラスPoint型のオブジェクトaのメンバ変数

a.y


p1.x+p2.x

p1.y+p2.y


が代入されていますね


クラスPoint型のオブジェクトaが


operator+(p1,p2)に


戻り値として返されることになるので



クラスPoint型のオブジェクトoperator+(p1,p2)のメンバ変数


operator+(p1,p2).x

operator+(p1,p2).y

に相当するものに


クラスPoint型のオブジェクトaのメンバ変数

a.x


クラスPoint型のオブジェクトaのメンバ変数

a.y


すなわち


p1.x+p2.x

p1.y+p2.y


が代入されていることになります。


ですので


さらに


p3=operator+(p1,p2);


が実行されると


クラスPoint型のオブジェクトp3のメンバ変数


p3.x

p3.y



operator+(p1,p2).x

operator+(p1,p2).y

に相当するものが代入される


つまり


p1.x+p2.x

p1.y+p2.y


が代入されることになります。


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y

1

1

が代入されていて


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y

2

2

が代入されているので


クラスPoint型のオブジェクトp3のメンバ変数


p3.x

p3.y


3

3

が代入されることになります


そして仕上げで


p3.pointdisplay();


の実行により


コマンドプロンプト画面に


3

3


が表示されているというわけです


p1+p2;


が実行されて


p1.x+p2.x

p1.y+p2.y


が実行されたってわけだね」


int(イント)「見事な解説ね ソーラーさん やったね。」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る