代入演算子=と違い比較演算子>のオーバーロードは普通の自作関数operator>を用いても実行することができます


ソーラー「比較演算子>のオーバーロードは


クラスのメンバ関数としてoperator>関数を設定する方法以外に


普通の自作関数operator>を設定する方法でも実行することができます


例えば次のように


クラスSuutitoMojiと


クラスSuutitoMojiのメンバ関数でない普通の自作関数であるoperator>関数の定義を


次のように設定してみたいと思います


👇


class SuutitoMoji{


public:


int x;


public:


char* i;



};


int operator>(SuutitoMoji& c, SuutitoMoji& d) {


if (c.x > d.x) {


return 1;

}

else {


return 0;


}

}


//👆クラスSuutitoMojiのメンバ関数でない普通の自作関数であるoperator>関数の定義です😊


マックス「このときの


operator>関数は


クラスSuutitoMojiのメンバ関数でない普通の自作関数なので


operator>関数のクラスSuutitoMojiのメンバ関数宣言



クラスSuutitoMojiのクラス宣言内に記述されていないというわけだな😊」


ソーラー「そうなんです


クラスSuutitoMojiと


クラスSuutitoMojiのメンバ関数でない


普通の自作関数operator>関数の定義を


用いて


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


そのプログラムはこちらとなります

👇

#include <iostream>


using namespace std;


class SuutitoMoji{


public:


int x;


public:


char* i;



};


int operator>(SuutitoMoji& c, SuutitoMoji& d) {


if (c.x > d.x) {


return 1;

}


else {


return 0;


}

}


int main() {


SuutitoMoji a;


a.x = 5;



SuutitoMoji b;



b.x = 2;


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


return 0;

}


ビルド実行結果


1



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


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


SuutitoMoji a;


により


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


a.x = 5;


が実行されることにより


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


a.xに5が代入されています


次に


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


SuutitoMoji b;


により


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


b.x = 2;


が実行されることにより


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


b.xに2が代入されています



そして


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


の実行ですね


まずは


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


           

           a > b



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



           a > b



が実行されるとき


自作関数

         operator>(a,b);


が実行されます」




ぶーにゃん「にゃお~ん」



ソーラー「ふふ


         operator>(a,b);


が実行されると


自作関数operator>関数の定義

👇

int operator>(SuutitoMoji& c, SuutitoMoji& d) {


if (c.x > d.x) {


return 1;

}


else {


return 0;


}

}

の引数となっている


参照変数宣言


SuutitoMoji& c


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


SuutitoMoji& d


クラスSuutitoMoji型のオブジェクトbが代入された



if (a.x > b.x) {


return 1;

}


else {


return 0;

}


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


クラスSuutitoMoji型のオブジェクトaのメンバ変数a.xには数値データ5


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xには数値データ2


が代入されているので



if (5 > 2) {


return 1;

}


else {


return 0;

}



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


ぶーにゃん「にゃ~~ん」


ソーラー「よし、よ~し、そうなんだよ😊」



ソーラー「そして


数値データ5と数値データ2に


比較演算子>を用いた


5 > 2は1で表されることになるので


if (1) {


return 1;

}


else {


return 0;

}


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


if (){}

else{}


()の中が1の場合は


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


if (){}

else{}の


()の中が0の場合は


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


ですので


return 1;


が実行されることになり



        operator>(a,b)



つまり


         a>b


には


戻り値として


         1


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



ですので


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


の実行結果は


1


となります」


マックス「おお


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

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

に比較演算子>

を用いたプログラムが実行できているじゃないか


比較演算子>のオーバーロードが


普通の自作関数operator>関数を設定して実行できてる!」



ソーラー「代入演算子=のオーバーロードを実行するときは


普通の自作関数operator=を設定する方法は使えず


クラスのメンバ関数としてoperator=関数を設定する方法しか使用できませんでした



比較演算子>のオーバーロードを実行するときは


普通の自作関数operator>を設定する方法も


クラスのメンバ関数としてoperator>関数を設定する方法も


使用できるんですね」


てんC「+演算子、++演算子のオーバーロードを実行するときも


普通の自作関数operator+

普通の自作関数operator++


を設定する方法と


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

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


を設定する方法も


使用できました


代入演算子=のオーバーロードの場合だけが普通の自作関数operator=を設定する方法しか使えないのですね


特殊な感じがしますね」


マックス「やっぱりぃ、てんC 俺もそう思う」























#include <iostream>


using namespace std;


class SuutitoMojidisplay {


public:


int x;


public:


char* i;



};


int operator>(SuutitoMojidisplay& c, SuutitoMojidisplay& d) {


if (c.x > d.x) {


return 1;

}

else {


return 0;


}

}

int main() {


SuutitoMojidisplay a;


a.x = 5;



SuutitoMojidisplay b;



b.x = 2;


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


return 0;

}

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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