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次元ベクトル
2次元ベクトル
の
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次元ベクトル
の第1項の
5が
a.y=5;
が実行されることにより
クラスVector型のオブジェクトaのメンバ変数
a.yに
2次元ベクトル
の第2項の
5が
代入されています
次に
bのクラスVector型のオブジェクト宣言
Vector b;
により
クラスVector型のオブジェクトbが作製され
b.x = 1;
が実行されることにより
クラスVector型のオブジェクトbのメンバ変数
b.xに
2次元ベクトル
の第1項の
1が
b.y = 1;
が実行されることにより
クラスVector型のオブジェクトbのメンバ変数
b.yに
2次元ベクトル
の第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次元ベクトル
の長さを表しています
クラスVector型のオブジェクトbのメンバ変数b.xには1
クラスVector型のオブジェクトbのメンバ変数b.yには1
が代入されているので
sqrt(b.x*b.x + b.y*b.y)
イコール
sqrt(2)
は
2次元ベクトル
の長さを表しています
if (sqrt(50)>sqrt(2)) {
return 1;
}
else {
return 0;
}
が実行されることになります
つまり
sqrt(50)>sqrt(2)
は
2次元ベクトル
の長さsqrt(50)
と
2次元ベクトル
の長さsqrt(2)
を比較しているんです」
マックス「プログラムを用いて
2次元ベクトル
の長さsqrt(50)
と
2次元ベクトル
の長さ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次元ベクトル
の長さsqrt(50)
が
2次元ベクトル
の長さsqrt(2)
より長ければ
a.operator>(b)
つまり
a>b
には
戻り値として
1
が返されることになります
ですので
cout << (a > b) << "\n";
の実行結果は
1
となります
そうですね
それでは
この
2次元ベクトル
の長さsqrt(50)
が
2次元ベクトル
の長さ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次元ベクトル
と
2次元ベクトル
を想定し
2次元ベクトル
と
2次元ベクトル
を
2次元ベクトル
と
2次元ベクトル
の
x
y
i
j
に
数値データ
5
5
1
1
を代入することにより表現しています
このプログラムでは
sqrt(x*x + y*y) > sqrt(i*i + j*j)
が実行されていますが
クラスを用いて
比較演算子>のオーバーロードを実行し
a>b
を実行した場合と比べて
いったい何が行われているのか?
2次元ベクトル
と
2次元ベクトル
の長さを
比較しているのか?
が
わかりにくいですね
クラスがとても優れたシステムであることがわかりますね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます