C++リロードオペレータ

2493 ワード

リロードオペレータとは?オペレータとは何かを先に言いますが、最も簡単なのは+、-、*、/、<
リロードオペレータとは何ですか?通常の基本タイプ、例えばint、floatは加減乗除してもよいし、cout<
Object obj1;
Object obj2;
Object obj3 = obj1 + obj2;
cout<

これはいけません(もちろん、初期化対象値がないからだけではありません).つまり、定義したクラス自体がこれらの操作をサポートしていないということです.もし私がサポートしたいなら?例えば、MyTimeクラスを定義します.時間の増減がよく、出力がもっとよくあります.まさか私は毎回使用時にメンバー変数を取得して自分で加減法を書いて自分で出力しますか?実はそんなに面倒ではありません.オペレータをリロードすればいいだけです.
では、どのように再ロードしますか?
リロードオペレータは実際には1つの形式のマルチステートであるため、C++自体のオペレータしかリロードできません.また、C++自体の操作方法でしか使用できません.たとえば、「-」番号では、2つのオブジェクトの減算にリロードしたり、1つのオブジェクトの負を表すために使用したりすることができますが、2つのオブジェクトの加算に「@」番号をリロードすることはできません.C++自体はこのような使い方がないからです.
リロードの方法は非常に簡単です.
//     :
operator op(argument-list)

//     :
Time oprator+(const Time &t);//           Time      
//   :
Time Time::operator+(const Time &t) {
  //             ,             ,       ,     
  //       Time  ,            Time
}

これでメソッドが作成されます.このメソッドはTimeクラスメソッドに格納されます.呼び出しは次のとおりです.
Time time1 = ...
Time time2 = ...
Time time3 = time1 + time2;

この時に加算できます.メソッド定義にはパラメータが1つしかないことに気づくかもしれませんが、実際にこのメソッド呼び出しプロセスは次のようになります.
Time time3 = time1.operator+(time2);

これが従来の方法であるが,リロードされたオペレータであるため,一般的なタイプのように直感的に使用できる.
したがって、実際には、パラメータをTimeタイプではなくintにすることもできます.
//   :
Time oprator+(int h);//           Time      
//   :
Time Time::operator+(int h) {
  //                 
  //       Time  ,            Time
}

//   :
Time time3 = time1 + 1;

これで通常のタイプと一緒に使えますが、便利ではありませんか.
しかし、これは1つのタイプをもたらし、リロードの使用方法は実際にはメソッド呼び出しの別の表現形式であり、すなわち第1のTime変数呼び出し方法であり、第2の変数(Timeでもintでも類似のメソッドを書くことができる)は伝達されるパラメータであることが分かった.
もし私がintタイプの値を最初に置いたら?次のようになります.
Time time3 = 1 + time1;

これはintタイプがTimeタイプパラメータの加算を呼び出す方法がないため、エラーが発生します.
しかし、この問題を友元関数で解決することができます.友元関数については、ここで簡単に紹介します.
クラスの友元関数は非メンバー関数であるため、メンバーオペレータで呼び出すことはできません.定義時に使用する必要はありません.:制限子ですが、メンバー関数のアクセス権と同じです.つまり、クラスのメンバーにアクセスできます.宣言はfriendで始まり、定義は不要です.
メタ関数を使用してintの前の加算を実現します.
//        ,         ,      ::   
//   :
friend Time  operator+(int h, const Time &t)

//   (    ::   ):
Time  operator+(int h, const Time &t) {
  //         
  //     Time    
}

//          :
Time time3 = 1 + time1;

これで私たちはいろいろな方法で使用することができます.
リロードオペレータで一番使いやすいのは何ですか?cout<です
//     :
friend std::ostream & operator<

便利ではないでしょうか.
作者のトップページを見る