这在c ++中。它是如何工作的?

时间:2012-04-08 19:25:51

标签: c++ this

我对我的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 个答案:

答案 0 :(得分:5)

因为如果你要分配给自己,你不想制作副本,这就是if条件的原因,*this返回自我实例。确实如此,因为您尝试分配y to x,因为它们都是不同的实例,然后您copy y to x。{/ p>

答案 1 :(得分:1)

仅当operator =的左操作数与右操作数相同时,

*this == &c 如果x = y ==&gt; *this != &c
如果x = x ==&gt; *this == &c因为两者都是一样的。 这通常是有用的,因为如果你自己分配,你就不需要副本。

答案 2 :(得分:0)

条件

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

用于检测自我分配。如果您有abc类型的对象并写入

abc a;
a = a;

然后,您将在operator =上调用a,将自身作为参数传递。在这种情况下,赋值运算符的许多实现都会中断,因为在清理对象以准备副本时,operator =(在这种情况下,a本身)的参数也将被清除。它很容易导致崩溃。因此,operator =的许多实现都以测试开始,即参数和接收者对象不是同一个对象。上述测试通过查看this指针(接收方)和参数(&c)的地址是否相同来完成此操作。如果是,则对象是相同的,并且不应该进行分配。否则,对象不一样,应该完成赋值。

至于返回*this,由于this是指向接收者对象的指针,*this是接收者对象本身。通过引用返回*this意味着您可以编写类似

的内容
(a = b) = c;

虽然这很愚蠢,但应该是合法的C ++。

希望这有帮助!

答案 3 :(得分:0)

if语句的计算结果为true,因为您没有为自己分配对象实例,从而满足!=运算符。您有两个单独的对象xy。它们有自己独特的this值。如果您在x = x中说main(),那么!=语句中的if运算符将评估为false,因为这两个值匹配。

答案 4 :(得分:0)

它将传递给该类的对象的地址与this指向的地址对象进行比较。如果地址相同,那么您已经传递了我们不想操作的对象本身。使用*this,您实际上是在运算符中传递指针引用。