普通の自作関数operator+を定義して+演算子のオーバーロードを行いp1+5;を実行してみます 何が実行されるかは自作関数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+関数の定義することができたね💡 


その時の定義はこちらです。

👇


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);


が実行されるんだろう」


てんC「


p1+p2;


実行されると


operator+(p1,p2);


が実行されるのですが


p1+p2;


と記述してあっても


必ず


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

p1.x

p1.y


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

p2.x

p2.y

同士の足し算


p1.x+p2.x

p1.y+p2.y


が実行されるのではなく


p1+p2;


が記述されたとき


どのような命令文が実行されるかは


自作関数operator+関数の定義次第ということになりますね。」



ソーラー「そうなんだ。


今度は


p1+p2;


ではなく


p1+5;


を実行してみたいと思うんだ。」


てんC「p1+5;


ですか?


p1+5;


が記述されたときも


どのような命令文が実行されるかは


自作関数operator+関数の定義次第ということになりますね」


ソーラー「


そう


そこで


Point型の


オブジェクトp1

数値5


同士の足し算


p1+5;


が記述されたとき


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

p1.x

p1.y


数値データ

5

5

の足し算


p1.x+5

p1.y+5


が実行されるよう


自作関数operator+関数の定義をしてみま~す💡 」


その定義はこちらになります(^_-)-☆

👇


Point operator+(Point p,int b){


Point a;


a.x=p.x+b;

a.y=p.y+b;


return a;

}


ソーラー「👆このように自作関数operator+関数の定義が設定されていると


main関数内で


            p1+5;


が実行されたとき


operator+(p1,5);


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


そのとき


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

👇

Point operator+(Point p,int b){


Point a;


a.x=p.x+b;

a.y=p.y+b;


return a;

}

👆

引数部分の


Point p

オブジェクトp1


int b

数値データ5



代入された


Point a;


a.x=p1.x+5;

a.y=p1.y+5;


return a;



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


ですので


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


a.x

a.y


には


p1.x+5;

p1.y+5;


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


もし


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


p1.x

p1.y

1

1

代入されていたなら


a.x

a.y


には


6

6

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


そして


return a;


により


オブジェクトaが


戻り値として


operator+(p1,5)


に返されることになります


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


クラスの型Pointに設定されているので


operator+(p1,5)に


戻り値として


オブジェクトaが


格納できるというわけです。


このとき


operator+(p1,5)は


クラスPoint型のオブジェクトに相当し


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


operator+(p1,5).x

operator+(p1,5).y


に相当するものに


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


a.x

a.y



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


a.x

a.y


には


6

6

代入されているので


operator+(p1,5).x

operator+(p1,5).y


に相当するものに


6

6

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


次に


p2のオブジェクト宣言


Pointdisplay p2;


を実行し


p2=operator+(p1,5);


を実行すると


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


p2.x

p2.y


には


6

6

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


あとは


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


p2.pointdisplay();


実行すれば


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


6

6


を表示することができます。」


その時のプログラムはこちらです

👇


#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, int b) {


Point a;


a.x = p.x + b;

a.y = p.y + b;


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+5;

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


p3.pointdisplay();


return 0;

}


ビルド実行結果


1

1

2

2

6

6


マックス「


自作関数operator+を用いての


+演算子のオーバーロード


を行い


p1+p2;


に続いて


p1+5;


も順調に実行できたな


にゃはっははは」









































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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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