在制作诅咒版本的Snake时,我发现该this
指针可绑定,可以从“ update”方法内部进行重建。
这样做的问题是,尽管非常方便(不必在游戏对象中重新绑定“玩家”),但它并不是特别习惯。
以蛇为例,我们将其销毁并重建它,因为它位于对initial(?)蛇的方法调用中。
这是this
在某些结构中重新绑定的示例A
:
struct A
{
int first;
A(int first) : first(first){};
void method(int i);
};
void A::method(int i)
{
*this = i;
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*ica 32
这是合法的,但是如果我看到了,我会质疑作者是否知道他们在做什么:它们真的意味着要调用this->operator=()
吗?当然,有更好的方法可以做...不管他们想做什么。
就您而言,*this = i
等于this->operator=(i)
。由于没有operator=(int)
定义,因此它使用默认的赋值运算符和A(int)
构造函数来执行this->operator=(A(i))
。最终效果与您编写的内容完全相同:
this->first = i;
Run Code Online (Sandbox Code Playgroud)
他们为什么不first
直接分配给他们?我会问。
如果出于某种原因您确实想要所有这些步骤,那么我至少要使隐式A(int)
构造明确:
*this = A(i);
Run Code Online (Sandbox Code Playgroud)
Oli*_*ort 12
*this = i;
隐式构造A
as的新实例A::A(int)
(不是explicit
构造函数),因此创建从int
到的隐式转换A
。*this = i;
然后A::operator=
使用A
构造自的新实例调用default i
。然后,新的实例A
被销毁。
因此,代码*this = i;
等同operator=(A(i));
于您的情况。
这样做是合法的,但是代码的可读性受到大量隐式操作的影响。
您并没有销毁所指向的对象this
,而是在调用它的对象operator=
,它将first
从初始化的临时对象复制i
。您在分配作业后销毁了临时作业。
编写具有A& operator=(int)
相同效果的可能更清楚。