2012-04-08 5 views
0

C++の宿題に関する質問があります。私はちょうどこれについて混乱しています。これはC++です。どのように機能するのですか?

以下のコードは私が持っているものです。

私の質問は、=演算子のif文の条件が真である理由です。

#include <cstring> 
class abc { 
     char p[9]; 
     int inc; 
    public: 
     abc() { inc = 8; strcpy(p, "10010101"); } 
     ~abc(); 
     abc& operator=(const abc &); 

}; 

abc::~abc() { 

} 
abc& abc::operator=(const abc &c) { 
    if(this != &c) { //my question is why this condition is true? 
     inc = c.inc - 2; 
     for(int i=0; i<inc; i++) { 
    p[i] = c.p[i] + 2; 
     } 
    } 
    return *this; 
} 

int main() { 
    abc x, y; 
    x = y; 
    return 0; 

} 

答えて

5

あなた自身に割り当てる場合は、コピーを作成したくないので、それは自己のインスタンスを返します*thisif状態、の理由です。 y to xを割り当てようとしているため、両方のインスタンスが異なるため、copyy to xにすると、これは当てはまります。

if(this != &c) { //my question is why this condition is true? 

+0

私は '二つのオブジェクトxとyがif文の条件を真とするために等しくないのはどういうものなのか理解していますか? – Jack

+0

if条件のアドレスではなく値を比較しているため、アドレスが異なります。 – EdChum

+0

oh yea !!!!!わかった。 – Jack

0

条件は、自己の割り当てを検出するために使用されます。あなたがタイプabcのオブジェクトを持っていると

abc a; 
a = a; 

を書くなら、あなたは、パラメータとして自分自身を渡し、aoperator =を呼び出します。代入演算子の多くの実装は、コピーの準備としてオブジェクトをクリーンアップするときに、operator =(この場合はa自体)の引数もクリーンアップされるため、この場合は中断されます。簡単にクラッシュすることがあります。したがって、operator =の多くの実装は、引数と受信者オブジェクトが同じオブジェクトではないというテストから始まります。上記のテストでは、thisポインタ(受信者)と引数のアドレス(&c)が同じかどうかを確認することでこれを行います。そうであれば、オブジェクトは同じであり、割り当ては行われません。それ以外の場合、オブジェクトは同じではなく、割り当てが行われます。

*thisを返す場合、thisは受信側オブジェクトへのポインタであるため、*thisは受信側オブジェクトです。参照によって*thisを返すことは、あなたが愚かながら、++法的Cことになって、

(a = b) = c; 

のようなものを書くことができることを意味します。

希望すると便利です。

1

*this == &cオペレータの左オペランドの場合にのみ、=は右オペランドと同じです。
x = yの場合==>*this != &cです。
x = xの場合==>*this == &c両方が同じであるため。 自分自身に割り当てる場合はコピーが必要ないので、通常は使用されます。

+0

ok !!!ありがとう – Jack

0

ifステートメントはtrueと評価されます。オブジェクトインスタンスを割り当てていないため、!=演算子を満たしていません。 2つの別々のオブジェクト、xyがあります。彼らは独自のthis値を持っています。 x = xmain()の代わりに指定した場合、if文の!=演算子は、2つの値が一致するため、falseになります。

0

クラスに渡されたオブジェクトのアドレスと、thisが指すアドレスオブジェクトを比較しています。アドレスが同じ場合は、操作したくないオブジェクト自体を渡したことになります。 *thisを使用すると、実際には演算子でポインタ参照を渡しています。

関連する問題