2次元ベクトルOAと2次元ベクトルOBの長さを比較するプログラムを実行してみたいと思います

ソーラー「では


次のようなクラスVectorがあるとします


#include <iostream>


using namespace std;


class Vector {


public:


int x;


public:


int y;



};


この


2つのメンバ変数をもつ


クラスVectorを用いれば


2つのクラスVector型のオブジェクト宣言を行い


2つのクラスVector型のオブジェクトを生成することにより


2つのクラスVector型のオブジェクトを用いて



2次元ベクトルOA(5,5)


2次元ベクトルOB(1,1)



2つの数値データ


(5,5)

(1,1)



管理することができます


ところで


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


Vector a;


により


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



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


Vector b;


により


クラスVector型のオブジェクトb



作製したとします


そして


比較演算子>のオーバーロードを実行することにより


もともと


比較演算子>が通常持っている機能に加えて


さらに


オブジェクトaとオブジェクトb

比較演算子>を作用させた


a>b


を記述した場合に


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


追加して設定することができます」


マックス「ふむん


比較演算子>のオーバーロードを実行することにより


比較演算子>が通常持っている機能に加えて


さらに


オブジェクトaとオブジェクトb

比較演算子>を作用させた


a>b


を記述した場合に


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


追加して設定することができる、か・・・


オブジェクトaとオブジェクトb


を比較する


a>b


が実行されるとき


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


自分で自由に決めることができる


つまり


比較演算子>のオーバーロードの定義内容は


自分で自由に決めることができるんだろう( ̄▽ ̄)」


ソーラー「そうなんです


では


クラスVectorに


クラスVectorのメンバ関数として


operator>関数を設定する方法を用いて


比較演算子>のオーバーロードを実行してみたいと思います


operator>関数の定義内容をどのように設定するかは


自由です


今回は



ふんふ~ん(^^♪



どのように


クラスVectorのメンバ関数であるoperator>関数の定義を設定しようかな😊


そうだ


次のように


クラスVectorのメンバ関数として


operator>関数を設定してみたいと思います


その


クラスVectorのクラス宣言と


クラスVectorのメンバ関数である


operator>関数の定義は次のようになります


👇

class Vector {


public:


int x;


public:


int y;


public:


int operator>(Vector& c);

//operator>関数のクラスVectorのメンバ関数宣言です

}


int Vector::operator>(Vector& c) {


if (sqrt(x*x+y*y)>sqrt(c.x*c.x+c.y*c.y) {


return 1;

}


else {


return 0;


}

}

//👆クラスVectorのメンバ関数であるoperator>関数の定義をおこなっています


マックス「なんだ?


sqrt(x*x+y*y)>sqrt(c.x*c.x+c.y*c.y)


てのは?


いったい何を比較しているんだ?」



ソーラー「


sqrt(x*x+y*y)は


x*x+y*yの(2分の1)乗を表していて



sqrt(c.x*c.x+c.y*c.y)は


c.x*c.x+c.y*c.yの(2分の1)乗を表しています


そして


sqrt(x*x+y*y)>sqrt(c.x*c.x+c.y*c.y)


が何を比較しているか?


ですか?



そうですね



とりあえず


実際に


このクラスVectorのクラス宣言



クラスVectorのメンバ関数である


operator>関数の定義


が用いられたプログラムを実行してみたいと思います


どのようなビルド実行結果が表示されるのでしょう~」


そのプログラムは次のようになります

👇


#include <iostream>


using namespace std;


class Vector {


public:


int x;


public:


int y;


public:


int operator>(Vector& c);


};


int Vector::operator>(Vector& c) {


if (sqrt(x*x + y*y)>sqrt(c.x*c.x + c.y*c.y)) {


return 1;

}

else {


return 0;


}

}

int main() {


Vector a;


a.x = 5;

a.y = 5;



Vector b;



b.x = 1;

b.y = 1;


cout << (a > b) << "\n";


return 0;

}


ビルド実行結果


1




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


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


Vector a;


により


クラスVector型のオブジェクトaが作製され


a.x = 5;


が実行されることにより


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


a.xに


2次元ベクトルOA(5,5)


の第1項の


5が


a.y=5;


が実行されることにより


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


a.yに


2次元ベクトルOA(5,5)


の第2項の


5が


代入されています


次に


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


Vector b;


により


クラスVector型のオブジェクトbが作製され


b.x = 1;


が実行されることにより


クラスVector型のオブジェクトbのメンバ変数


b.xに


2次元ベクトルOB(1,1)


の第1項の


1が


b.y = 1;


が実行されることにより


クラスVector型のオブジェクトbのメンバ変数


b.yに


2次元ベクトルOB(1,1)


の第2項の


1が


代入されています



さて


cout << (a > b) << "\n";


の実行ですね


まず


クラスVector型のオブジェクトaとクラスVector型のオブジェクトbに比較演算子>を用いた


           

           a > b



が実行されると何が起きるかということですね



普通は


クラスVector型のオブジェクトaとクラスVector型のオブジェクトbに比較演算子>を用いた


           

           a > b


を実行することはできません


このプログラムの場合


比較演算子>のオーバーロードが実行されているので




           a > b



が実行されるとき


クラスVector型のオブジェクトaのメンバ関数



         a.operator>(b);



が実行されます


        a.operator>(b);


が実行されると


クラスVectorのメンバ関数であるoperator>関数の定義

👇

int Vector::operator>(Vector& c) {


if (sqrt(x*x + y*y)>sqrt(c.x*c.x + c.y*c.y)) {


return 1;

}


else {


return 0;


}


参照変数宣言


Vector& c


クラスVector型のオブジェクトbが


xに


クラスVector型のオブジェクトaのメンバ変数a.xが


yに


クラスVector型のオブジェクトaのメンバ変数a.yが


代入された


if (sqrt(a.x*a.x + a.y*a.y)>sqrt(b.x*b.x + b.y*b.y)) {


return 1;

}


else {


return 0;

}


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


ところで


sqrt(a.x*a.x + a.y*a.y)>sqrt(b.x*b.x + b.y*b.y)


は何を意味しているかですね


クラスVector型のオブジェクトaのメンバ変数a.xには5


クラスVector型のオブジェクトaのメンバ変数a.yには5



クラスVector型のオブジェクトbのメンバ変数b.xには1


クラスVector型のオブジェクトbのメンバ変数b.yには1


が代入されているので



sqrt(a.x*a.x + a.y*a.y)


イコール


sqrt(50)



2次元ベクトルOA(5,5)


の長さを表しています



クラスVector型のオブジェクトbのメンバ変数b.xには1


クラスVector型のオブジェクトbのメンバ変数b.yには1


が代入されているので


sqrt(b.x*b.x + b.y*b.y)


イコール


sqrt(2)



2次元ベクトルOB(5,5)


の長さを表しています



if (sqrt(50)>sqrt(2)) {


return 1;

}


else {


return 0;

}



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


つまり


sqrt(50)>sqrt(2)



2次元ベクトルOA(5,5)


の長さsqrt(50)



2次元ベクトルOB(1,1)


の長さsqrt(2)


を比較しているんです」


マックス「プログラムを用いて


2次元ベクトルOA(5,5)


の長さsqrt(50)



2次元ベクトルOB(1,1)


の長さsqrt(2)


を比較しているわけか(*´▽`*)」



ソーラー「そうなんです😊


数値sqrt(50)とsqrt(2)に


比較演算子>を用いた


sqrt(50)>sqrt(2)は成立し


1で表されることになるので


if (1) {


return 1;

}


else {


return 0;

}


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


if (){}

else{}


()の中が1の場合は


()につづく{}内の命令文が実行されることになります


if (){}

else{}の


()の中が0の場合は


else{}内の{}内の命令文が実行されることになります


ですので


if (1) {


return 1;

}


else {


return 0;

}


においては


return 1;


が実行されることになり



クラスVector型のオブジェクトaのメンバ関数


        a.operator>(b)


つまり


         a>b


には


戻り値として


         1


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



つまり


2次元ベクトルOA(5,5)


の長さsqrt(50)



2次元ベクトルOB(1,1)


の長さsqrt(2)


より長ければ


        a.operator>(b)


つまり


         a>b


には


戻り値として


         1


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


ですので


cout << (a > b) << "\n";


の実行結果は


1


となります



そうですね



それでは


この


2次元ベクトルOA(5,5)


の長さsqrt(50)



2次元ベクトルOB(1,1)


の長さsqrt(2)


より長ければ


        a.operator>(b)


つまり


         a>b


には


戻り値として


         1


が返されることを応用したプログラムを実行してみよっかな


そのプログラムは次のようになります

👇

#include <iostream>


using namespace std;


class Vector {


public:


int x;


public:


int y;


public:


int operator>(Vector& c);


};


int Vector::operator>(Vector& c) {


if (sqrt(x*x + y*y)>sqrt(c.x*c.x + c.y*c.y)) {


return 1;

}


else {


return 0;


}

}


int main() {


Vector a;


a.x = 5;

a.y = 5;



Vector b;



b.x = 1;

b.y = 1;


if (a > b) {


cout <<" 2次元ベクトルOAは2次元ベクトルOBより長いです" << "\n";

}


else{


cout <<" 2次元ベクトルOAは2次元ベクトルOBより長くないです" << "\n";

}


return 0;

}


プログラムの実行結果


2次元ベクトルOAは2次元ベクトルOBより長いです




ソーラー「


クラスも用いず


比較演算子>のオーバーロードを実行しないで


2次元ベクトルOAと2次元ベクトルOBの長さを比較するプログラムは次のようになります

👇

#include <iostream>


using namespace std;



int main() {


int x;

int y;

int i;

int j;



x = 5;

y = 5;


i = 1;

j = 1;



if (sqrt(x*x + y*y) > sqrt(i*i + j*j)) {


cout << " 2次元ベクトルOAは2次元ベクトルOBより長いです" << "\n";

}


else {


cout << " 2次元ベクトルOAは2次元ベクトルOBより長くないです" << "\n";

}

return 0;


}


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


2次元ベクトルOA(x,y)



2次元ベクトルOB(i,j)


を想定し



2次元ベクトルOA(5,5)



2次元ベクトルOB(1,1)



2次元ベクトルOA(x,y)



2次元ベクトルOB(i,j)



x

y

i

j



数値データ


5

5

1

1


を代入することにより表現しています


このプログラムでは


sqrt(x*x + y*y) > sqrt(i*i + j*j)


が実行されていますが


クラスを用いて


比較演算子>のオーバーロードを実行し


a>b


を実行した場合と比べて


いったい何が行われているのか?



2次元ベクトルOA(5,5)



2次元ベクトルOB(1,1)


の長さを


比較しているのか?



わかりにくいですね


クラスがとても優れたシステムであることがわかりますね」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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