我对我的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;
}
答案 0 :(得分:5)
因为如果你要分配给自己,你不想制作副本,这就是if
条件的原因,*this
返回自我实例。确实如此,因为您尝试分配y to x
,因为它们都是不同的实例,然后您copy
y to x
。{/ p>
答案 1 :(得分:1)
*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
,因为您没有为自己分配对象实例,从而满足!=
运算符。您有两个单独的对象x
和y
。它们有自己独特的this
值。如果您在x = x
中说main()
,那么!=
语句中的if
运算符将评估为false
,因为这两个值匹配。
答案 4 :(得分:0)
它将传递给该类的对象的地址与this
指向的地址对象进行比较。如果地址相同,那么您已经传递了我们不想操作的对象本身。使用*this
,您实际上是在运算符中传递指针引用。