在制作诅咒版本的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;隐式构造Aas的新实例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)相同效果的可能更清楚。
| 归档时间: |
|
| 查看次数: |
2064 次 |
| 最近记录: |