2017-08-19 11 views
3

..... この場合、演算子のオーバーロードはどのように機能しますか?私は、この演算子のオーバーロードは、このコードでは、ここでどのように機能するかを取得

class operatorOver { 
public: 
    int a, b, c; 
}; 

operatorOver operator+(const operatorOver &a, const operatorOver &b) { 
    operatorOver aa; 
    aa.a = b.a + a.a; 
    return aa; 
} 

int main() 
{ 
    operatorOver aaa, bbb, ccc; 

    aaa.a = 100; 
    bbb.a = 200; 
    ccc = aaa + bbb; 

    cout << ccc.a << endl; 

    system("pause"); 
}; 

が、この1つはここにどのように動作するか私は理解していない、このバージョンは....

class operatorOver { 
public: 
    operatorOver operator+(const operatorOver &a) { 
     operatorOver aa; 
     aa.a = (*this).a + a.a; 
     return aa; 
    } 

    int a, b, c; 
}; 

int main() 
{ 
    operatorOver aaa, bbb, ccc; 

    aaa.a = 100; 
    bbb.a = 200; 
    ccc = aaa + bbb; 

    cout << ccc.a << endl; 

    system("pause"); 
}; 

私が示した最初の1つは、ここでオーバーロードされている演算子のコードが2つのオブジェクトクラスを取り込んでいると仮定しています...

しかし、2番目の例では、パラメータに別のオブジェクトクラスを作成しても動作します。あなたがmain()を見ると、2つのオブジェクトクラスがまだ渡されていることがわかります。私は失われています。

+0

、Iは、第一の方法(非メンバ関数)を好みますその場合、aがoperatorOverではない場合はa + bであり、operatorOverはaの型からoperatorOverへの変換コンストラクタを持つため、これは呼び出されますが、メンバ関数を使用するとそれは行われません。 Sidenote:正当な理由がない限り、資本でクラスを始める。彼らがラクダのケースを使用するなら、ほとんどのC++開発者の習慣です。したがって、operatorOverではなくOperatorOverです。 –

答えて

3

あなたのメンバ演算子はまた、あなたが割り当てられていない値を使用しているので、未定義の振る舞いを呼び出します+のようなバイナリ演算子の中には、メンバ関数としてだけでなく非メンバ関数としてもオーバーロードすることができます。

+がメンバ関数として多重定義されている場合、関数は1つの引数で宣言する必要があります。オペレータとして使用する場合:

a + b 

それは非メンバ関数として過負荷になると、コールが

a.operator+(b); 

として解決され、関数は2つの引数を宣言する必要があります。オペレータが使用される場合のように呼を

operator+(a, b); 

また読み出しとして解決され

a + b 

:ところでhttp://en.cppreference.com/w/cpp/language/operators

+0

ohhhhhhhhhhh私は今、それを得る!だから私はこれをまっすぐにしましょう...オーバーロード演算子がクラス構造内で定義されている場合、それは 'a'になります。演算子+(b) 'ですが、オーバーロード演算子がクラス構造の外で定義されている場合、演算子+(a、b)になります。 – thundergawd

+0

@thundergawd、あなたは大歓迎です。私は喜んで助けてくれました。 –

+0

まだ質問があります...なぜ、最初の例が機能するには(* this)必要ですか?それは(* this)== aaaですか?なぜこの場合ですか?編集 - ああ、私はちょうどそれを考え出した、非常に多くのtv! – thundergawd

3

2番目の例では、2つのオブジェクトが渡されます。 aがあり、thisもあります。 thisとして渡されたオブジェクトは、操作の左側です。

また、メンバーoperator+は、thisというデータメンバーを変更しないため、constである必要があります。非メンバ関数あなたに相当すると

// The member function 
operatorOver operator+(const operatorOver &a) { 
    operatorOver aa; 

    // What is the value of aa.a? Undefined behavior! 
    aa.a = aa.a + a.a; 
    return aa; 
} 

、それはこの実装する必要があります:

// The member function 
operatorOver operator+(const operatorOver &a) const { 
    operatorOver aa; 

    // Member `a`, could be written `this->a` 
    aa.a = a + a.a; 
    return aa; 
} 
+0

さて、私はちょうど私がそれを持っていたが、最初の例を示すためにそれを変更する前に、(* this)を入れるのを忘れてしまった。 2番目の元を修正するために戻った。私はそれを正しく置くことを忘れた..... – thundergawd

関連する問題