0

我对我的 C++ 作业有疑问。我只是对 *this 感到困惑。

下面的代码是我所拥有的。

我的问题是为什么 = 运算符中的 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返回 self 实例。这是真的,因为您正在尝试分配y to x,并且它们都是不同的实例,因此您可以创建 a copyof y to x

于 2012-04-08T19:29:23.610 回答
1

*this == &c只有在 operator= 的左操作数与右操作数相同的情况下。
x = y==>的情况下*this != &c
x = x==>的情况下,*this == &c因为两者都是相同的。它很常用,因为如果您分配给自​​己,则不需要副本。

于 2012-04-08T19:30:57.223 回答
0

条件

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

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

abc a;
a = a;

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

至于return *this,sincethis是一个指向receiver对象的指针,*this就是receiver对象本身。通过引用返回*this意味着您可以编写类似的内容

(a = b) = c;

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

希望这可以帮助!

于 2012-04-08T19:30:36.370 回答
0

if语句的计算结果为,true因为您没有将对象实例分配给自身,因此满足!=运算符。您有两个单独的对象,x并且y. 他们有自己独特的this价值观。如果您x = x改为 in main(),则语句中的!=运算符将改为改为,因为这两个值将匹配。iffalse

于 2012-04-08T19:34:46.453 回答
0

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

于 2012-04-08T19:41:37.957 回答