0

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;

}
4

5 に答える 5

5

自分自身に割り当てている場合はコピーを作成したくないため、それがif条件の理由であり、*this自己インスタンスを返します。y to x割り当てようとしていて、両方とも異なるインスタンスであるため、それは本当copyですy to x

于 2012-04-08T19:29:23.610 に答える
1

*this == &coperator= の左オペランドが右オペランドと同じ場合のみ。==>
の場合。==> の場合はどちらも同じだからです。自分に割り当てればコピーがいらないのでよく使われます。x = y*this != &c
x = x*this == &c

于 2012-04-08T19:30:57.223 に答える
0

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

于 2012-04-08T19:41:37.957 に答える
0

オブジェクトインスタンスをそれ自体に割り当てていないため、ステートメントはに評価され、演算子を満たしifます。2つの別々のオブジェクトがあります。それらには独自の値があります。代わりにで言った場合、2つの値が一致するため、ステートメントの演算子は代わりに評価されます。true!=xythisx = xmain()!=iffalse

于 2012-04-08T19:34:46.453 に答える
0

条件

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

自己割り当てを検出するために使用されます。abcタイプと書き込みのオブジェクトがある場合

abc a;
a = a;

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

を返す*thisのは、thisがレシーバ オブジェクトへのポインタであるため、*thisがレシーバ オブジェクトそのものです。参照によって返す*thisということは、次のように書くことができることを意味します

(a = b) = c;

これはばかげていますが、正当な C++ であるはずです。

お役に立てれば!

于 2012-04-08T19:30:36.370 に答える