c – 在构造函数和析构函数中调用this->可以安全 - 代码日志

c – 在构造函数和析构函数中调用this->可以安全

到目前为止,我还没有找到一个确切的答案。什么时候可以安全地称之为 – >从一个物体内。特别是从构造函数和析构函数里面。

而且,当使用公共继承时。对这个电话的结果使用up和downcast是安全的吗?

所以例如:

class foo
{
   foo():
   a(),
   b(this->a)//case 1
   {
       this-> a = 5; //case 2
   }

   int a;
   int b;
};

class bar: public baz
{
   bar():
   baz(this)//case 3 - assuming baz has a valid constructor
   {


   }

}

最后最不可能的

foo()
   {
      if(static_cast<bar*>(this));//case 4
   }

以上哪些情况属合法?

注意:我知道很多上述做法是不合适的。

在任何非静态成员函数中,它指向调用该函数的对象。只要这是一个有效的对象就可以安全使用。

在构造函数或析构函数的正文中,有一个正在构造的类的有效对象。但是,如果这是一些派生类的基本子对象,则只有基本子对象在当时有效;所以down-cast通常不安全,并尝试访问派生类的成员。同样的原因,您需要在这里谨慎调用虚拟函数,因为它们根据正在创建或销毁的类调度,而不是最终的覆盖。

在构造函数的初始化列表中,您只需要注意访问已初始化的成员;也就是说,在正在初始化之前宣布的成员。

升级到基类总是安全的,因为基本子对象始终被初始化。

对于您刚刚添加到问题的具体示例:

> case 1是罚款(如果是脆弱的),因为a已经被初始化了。初始化b的值将是未定义的,因为b在a之后被初始化。
>案例2是罚款:所有成员在这一点上已被初始化。
> case 3将不会编译,因为没有合适的foo构造函数。如果有的话,那将取决于构造函数所做的 – 无论是否在初始化之前尝试访问成员。
> case 4将格式正确,如果您添加了缺失),但如果您尝试使用指针访问该对象是危险的。这还没有指向有效的条形对象(只有foo部分已被初始化),所以访问bar的成员可能会给出未定义的行为。只需检查指针是否为非空,则会一直为真(无论是否应用无意义的转换)。

http://stackoverflow.com/questions/30258639/when-is-it-safe-to-call-this-in-constructor-and-destructor

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 在构造函数和析构函数中调用this->可以安全