5回目のジョブ-演算子の再ロード

2600 ワード

演算子の再ロード
演算子のリロードとは、既存の演算子に多重の意味を与え、同じ演算子を異なるタイプのデータに作用させると異なる動作を引き起こすことです.
演算子リロードのルール
(1)C++の演算子は少数を除いてすべてリロード可能であり,C++の既存の演算子のみをリロードできる.(2)リロード後の演算子の優先度と結合性は変わらない.(3)演算子のリロードは,新しいタイプのデータの実際のニーズに対して,既存の演算子を適切に改造する.リロード演算子関数は、演算子に対して新しい解釈を行うことができますが、元の基本的な意味は変わりません.演算子の優先度、結合性、必要なオペランドは変更されず、新しい演算子は作成されません.
演算子をメンバー関数として再ロード
例:複数クラス加算減算を関数メンバー形式にリロードする
#include 
using namespace std;

class Complex {                                                
public:                                                        
    Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {}       
    Complex operator+(const Complex& c2) const;//   +      
    Complex operator-(const Complex& c2) const;//   -      
    void display() const;//      
private:
    double real, imag; //       
};
Complex Complex::operator+(const Complex& c2) const {  //         
    return Complex(real + c2.real, imag + c2.imag);//               
}

Complex Complex::operator-(const Complex& c2) const { //         
    return Complex(real - c2.real, imag - c2.imag);//               
}

void Complex::display() const {
    cout << "(" << real << "," << imag << ")" << endl;
}

int main() {
    Complex c1(5, 4), c2(2, 10), c3;
    cout << "c1=";
    c1.display();
    cout << "c2=";
    c2.display();
    c3 = c1 - c2; //             
    cout << "c3=c1-c2=";
    c3.display();
    c3 = c1 + c2;
    cout << "c3=c1+c2";//             
    c3.display();
    return 0;
}

//    
//c1=(5,4);
//c2=(2,10);
//c3=c1-c2=(3,-6);
//c3=c1+c2=(7,14);

関数宣言および実装時にキーワードoperatorを使用した場合を除き、演算子リロードメンバー関数はクラスの通常のメンバー関数と何の違いもありません.使用する場合は、演算子、オペランドで直接関数呼び出しを完了できます.この場合、演算子「+」、「-」の本来の機能は変更されず、整数数、浮動小数点数などの基本型データの演算はC++の事前定義のルールに従うとともに、複素演算に対する新しい機能が追加される.「+」という演算子は、異なるオブジェクトに作用すると、まったく異なる動作を引き起こし、より広範なマルチステートフィーチャーを有します.
演算子を非メンバー関数として再ロード
例:Complexを非メンバー関数として再ロードする減算演算と"<
#include
using namespace std;

class Complex {
public:
    Complex(double r=0.0,double i=0.0):real(r),imag(i){}
    friend Complex operator+(const Complex& c1, const Complex& c2);//   +  
    friend Complex operator-(const Complex& c1, const Complex& c2);//   -  
    friend ostream& operator<

演算子の2つのリロード形式にはそれぞれ千秋があります.メンバー関数のリロード方法はより便利ですが、次の理由で非メンバー関数のリロード方法を使用する必要がある場合があります.(1)リロードするオペレータの最初のオペランドは変更可能なタイプではありません.たとえば、前例の<(2)は非メンバー関数としてリロードされ、より柔軟なタイプ変換をサポートします.