【C++】C++学習ノートその6:オペレータリロード

2550 ワード

1.オペレータのリロードの意味
C++に組み込まれたデータ型については、オペレータを使用して次のように簡単にデータを処理できます.
//   
int a=0, b=10;
a += b;
//             
cout << a++ << "," << b << endl;

ユーザーがカスタマイズしたクラスでは、オペレータに対応する処理スキームを作成しなければ、どんなに強力な言語でも、予測不可能な将来のユーザー行動を互換性することはできません.オペレータのリロードはクラスごとに必ずしも必要ではありませんが、次の例のように、関数を使用してオペレータの代わりに使用することもできます.
class complex{
    double re, im;
public:
    inline complex operator+(const complex & c){
        return complex(this->re + c.re, this->im + c.im);
    }
    inline complex add(const complex &c){
        return complex(this->re + c.re, this->im + c.im);
    }
};

上のコードには、2つの関数が表示されます.1つはオペレータの再ロードで、1つは通常の関数です.しかし、完成したのはcomplexクラスのインスタンスを加算する機能です.書き方は関数名以外は同じですが、使うときは全然違います.
int main(){
     complex c1(3,5), c2(4,6), c3,c4;
     c3 = c1 + c2;//     
     c4 = c1.add(c2);//         
}

どちらの方法がわかりやすいですか?オペレータの再ロードの意味は言うまでもありません.
2.オペレータ
オペレータには、1元オペレータ、2元オペレータ、多重オペレータ(?:)などがありますが、オペレータのリロードについては、各オペレータがリロードできるわけではありません.c++は、リロードできないオペレータには、「:」、「.*」、「.」が規定されています.と「?:」一部のオペレータは、構文的にはリロードをサポートしていますが、リロードすべきではありません.リロードされると、一部のプロパティが保持できないため、通常とは異なります.たとえば、次のようになります.
理由をリロードすべきではない
オペレータテーブル
一部のオペレータの演算順序規則は保持できません
& |
一部のオペレータのショート求職プロパティは保持できません
&& ||
一部のオペレータはクラスタイプオブジェクトに特別な意味を持つ
, &
3.オペレータリロード関数
オペレータのリロードには2つの方法があります.1.メンバー関数としてのオペレータは、関数2をリロードする.グローバル関数としてのオペレータリロード関数
グローバル関数のオペレータとして関数を再ロードすると、オペレータは数元でいくつかのパラメータがあります.ただし、リロードされたオペレータがクラスメンバー関数である場合、thisは左側の演算オブジェクトにバインドされます.メンバーオペレータ関数の表示パラメータの数は、演算オブジェクトの数より1つ少ないです.すなわち、2元オペレータには1つのパラメータしか必要ありません.1元オペレータにはパラメータは必要ありません.
具体的な違いはコードを見る:
class complex{
    double re, im;
public:
    inline complex operator+(const complex & c){
         return complex(this->re + c.re, this->im + c.im);
    }
    friend complex operator+(const complex & c1, const complex & c2);
};

inline  complex operator+(const complex & c1, const complex & c2){
    return complex(c1.re + c2.re, c1.im + c2.im);
}

以上のコードは例にすぎません.実際のプログラミングでグローバルなオペレータリロード関数とクラスメンバー関数は両方しか選択できません.そうしないと衝突し、コンパイラはどちらを呼び出すべきか分かりません.
PS:オペレータリロード関数だけでなく、すべてのクラスメンバー関数にステルスパラメータがあります.thisポインタ
PS:関数のリロードの原理:同じ関数名、異なる関数パラメータ、なぜコンパイラは正確に対応する関数を見つけて呼び出すことができますか?奥義は、コンパイラがパラメータ連通関数名をコードにコンパイルして関数を一意に識別することであり、これは、戻り値タイプの異なる関数だけが再ロードできず、エラーが発生する理由である.各リロード関数のパラメータタイプやパラメータ個数が異なるため、作成された関数は、コンパイラの目には実際には異なる関数であるため、コンパイラはどちらを呼び出すかを正確に見つけることができます.