针对“ this”进行构造是惯用的吗?

Cat*_*ium 28 c++

在制作诅咒版本的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)

  • 在阅读此代码时,我认为这是不幸的情况之一,编译器错过了对代码发出警告的机会,而这显然并没有满足程序员的要求。然后在代码审查中,我指出,如果他声明了单参数构造函数“ explicit”,他就不会遇到这个问题。 (12认同)

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));于您的情况。

这样做是合法的,但是代码的可读性受到大量隐式操作的影响。


Cal*_*eth 9

您并没有销毁所指向的对象this,而是在调用它的对象operator=,它将first从初始化的临时对象复制i。您在分配作业后销毁了临时作业。

编写具有A& operator=(int)相同效果的可能更清楚。