比較演算子>の通常の機能に新たな機能を加えるため比較演算子>のオーバーロードを実行してみます



🌞    🌞    🌞    🌞    🌞    🌞    🌞





代入演算子=のオーバーロードを実行することができるようになりました😊





🌞    🌞    🌞    🌞    🌞    🌞    🌞




ソーラー「代入演算子=のオーバーロードの実行方法も理解できたかな?」



マックス「代入演算子=のオーバーロードを実行することになるとは


思はなかったな


面白かったな やりがいがあったな」


ソーラー「代入演算子=のオーバーロードを実行する方法を通して


なんだかとてもプログラムにくわしくなった気がするね」



int(イント)「もう


他の演算子のオーバーロードを実行することってないのかな?」



ソーラー「そうですね




           そんなあなたに!



                               」


マックス「え?」


ソーラー「今度は比較演算子>のオーバーロードを実行してみます」


solarplexuss「ええっ」


マックス「比較演算子>のオーバーロード?


はあ  はあ


なんだぁ?


意味が分からん」


ソーラー「比較演算子>のオーバーロードはとっても単純です


その前にもともとの


比較演算子>の仕組みについておさらいしてみましょう


まずは次のプログラムをご覧ください


#include <iostream>


using namespace std;


int main() {


cout << (5>2) << "\n";

cout << (2>5) << "\n";


return 0;

}


プログラムの実行結果


1

0


ソーラー「


cout << (5>2) << "\n";

cout << (2>5) << "\n";


の実行結果が


1

0


になっています


つまり


5>2

2>5



1

0


表しています


5>2

2>5



論理式と呼ばれます


このように


比較演算子>は


5>2

2>5

左辺に代入される数値データと右辺に代入される数値データを比較して


5>2

2>5


0

1

の値を与える機能があります」


マックス「にゃるほど」


ソーラー


「また次のプログラムをご覧ください

👇


#include <iostream>


using namespace std;


int main() {


int a;

int b;


a = 5;

b = 2;


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


return 0;

}



プログラムの実行結果


1


マックス


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


の実行結果が1・・・

つまり


(a > b) が1をあらわしているってことか?」


ソーラー「そうなんです


int a;

int b;


a = 5;

b = 2;



の実行により


int型の変数aに5


int型の変数bに2が代入されています


この状態で


a>b


を実行すると


a>b



1を表すことになります


つまり


変数aに格納されている数値データと


変数bに格納されている数値データを


比較して


変数aに格納されている数値データが変数bに格納されている数値データより


大きければ


a>b


は1の値を持ちます


また


次のプログラムをご覧ください

👇

#include <iostream>


using namespace std;


int main() {


int a;

int b;


a = 2;

b =5;


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


return 0;

}


プログラムの実行結果


0


マックス


「今度はcout << (a > b) << "\n";


の実行結果が0・・・

つまり


(a > b) が0をあらわしているってことか?」


ソーラー「そうなんです


int a;

int b;


a = 2;

b = 5;



の実行により


int型の変数aに2


int型の変数bに5が代入されています


この状態で


a>b


を実行すると


a>b



0を表すことになります


つまり


変数aに格納されている数値データと


変数bに格納されている数値データを


比較して


変数aに格納されている数値データが変数bに格納されている数値データより


小さければ


a>b



0の値を持ちます」




マックス「まるで


a>b



戻り値として


1

0


が返されてるみたいだな」


ソーラー「そんな感じですね


ところで


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

👇

class SuutitoMoji{


public:


int x;


public:


char* i;


};


ソーラー「🌞


このとき


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


SuutitoMoji a;


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


SuutitoMoji b;


を実行して


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


を実行したなら


ビルド実行結果に何が表示されると思いますか?」


マックス「?????・・・・」


int(イント)「・・・・・」


ソーラー「はい😊 int(イント)さん」


int(イント)「う~ん、わかりません」


マックス「


a>b


とは


クラスSuutitoMoji型のオブジェクトaとクラスSuutitoMoji型のオブジェクトbを比較しているのか?


ていうか


クラスSuutitoMoji型のオブジェクトaとクラスSuutitoMoji型のオブジェクトbの何を比較していることになるんだ?」



ソーラー「わたしもわかりませ~ん」


ソーラー「そこで


SuutitoMoji a;


SuutitoMoji b;


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


を実行したなら


どのような


ビルド実行結果が表示されるのか実際に試してみましょう


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

👇

#include <iostream>


using namespace std;


class SuutitoMoji {


public:


int x;


public:


char* i;


};




int main() {


SuutitoMoji a;


SuutitoMoji b;


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



return 0;

}



ビルド実行結果



エラー C2676 二項演算子 '>': 'SuutitoMoji' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照)

エラー (アクティブ) E0349 これらのオペランドと一致する演算子 ">" はありません

エラー C2784 'bool std::operator >(const _Elem *const ,const std::basic_string<_Elem,_Traits,_Alloc> &)': テンプレート 引数を 'const _Elem *const ' に対して 'SuutitoMoji' から減少できませんでした

エラー C2784 'bool std::operator >(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)': テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'SuutitoMoji' から減少できませんでした

エラー C2784 'bool std::operator >(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)': テンプレート 引数を 'const std::pair<_Ty1,_Ty2> &' に対して 'SuutitoMoji' から減少できませんでした

エラー C2784 'bool std::operator >(const std::move_iterator<_RanIt> &,const std::move_iterator<_RanIt2> &)': テンプレート 引数を 'const std::move_iterator<_RanIt> &' に対して 'SuutitoMoji' から減少できませんでした

エラー C2784 'bool std::operator >(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *const )': テンプレート 引数を 'const std::basic_string<_Elem,_Traits,_Alloc> &' に対して 'SuutitoMoji' から減少できませんでした

エラー C2784 'bool std::operator >(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &) noexcept': テンプレート 引数を 'const std::basic_string<_Elem,_Traits,_Alloc> &' に対して 'SuutitoMoji' から減少できませんでした



マックス「うっわ


ビルドエラー表示 ながっっ」




ソーラー「


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


を実行することができず


ビルドエラーが表示されましたね


(a>b) の部分が問題ですね


もともと


比較演算子>には


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


比較するという機能はないからです」


マックス「まあ そうだろう



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

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


a>b


を実行しようとしても


コンパイラは


a>b



どう機械語に翻訳したらいいか


わからないんじゃないか


だから


ビルドエラーが表示されることになるんだろう?」


ソーラー「そうなんです


そこで


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


今 ご紹介した


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


さらに


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

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


a>b


を記述した場合に


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


比較演算子>に追加して設定することができます」



















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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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