c++ - 什么时候在构造函数和析构函数中调用 this-> 是安全的

标签 c++ c++11 constructor destructor

到目前为止,我还没有找到确切的答案。什么时候从对象中调用 this-> 是安全的。尤其是在构造函数和析构函数内部。

而且,当使用公共(public)继承时。对 this 调用的结果使用向上和向下转换是否安全?

例如:

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
   }

以上哪些情况是合法的?

注意:我知道上面的很多做法都是不可取的。

最佳答案

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

在构造函数或析构函数的主体中,存在当前正在构造的类的有效对象。但是,如果这是某个派生类的基础子对象,那么此时只有基础子对象有效;因此,向下转换并尝试访问派生类的成员通常是不安全的。出于同样的原因,您需要在此处小心调用虚函数,因为它们是根据正在创建或销毁的类而不是最终覆盖器来调度的。

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

向上转换到基类总是安全的,因为基子对象总是首先初始化。

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

  • case 1 很好(如果很脆弱),因为此时 a 已被初始化。用 b 的值初始化 a 将是未定义的,因为 b 是在 a 之后初始化的。
  • 情况 2 很好:此时所有成员都已初始化。
  • case 3 不会编译,因为没有合适的 foo 构造函数。如果有,那么这将取决于构造函数对它做了什么——它是否在初始化之前尝试访问成员。
  • 如果您添加了缺少的 ),情况 4 的格式会很好,但如果您尝试使用指针访问该对象,则很危险。 this 还没有指向一个有效的 bar 对象(只有 foo 部分已经初始化)所以访问 bar 的成员code> 可能会给出未定义的行为。简单地检查指针是否为非空就可以了,并且总是会给出 true (无论你是否应用了无意义的强制转换)。

关于c++ - 什么时候在构造函数和析构函数中调用 this-> 是安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30258639/

相关文章:

c++ - 将不同的对象传递给一个函数

c++ - 如何使用前向声明类的成员函数?

c++ - 为什么 std::async 比简单的分离线程慢?

java - 如何从参数化构造函数(Java)调用构造函数?

java - "this"引用在构造期间转义?

c++ - 如何等待未知数量的进程结束

c++ - const char* 类名::getname() const ? first const 关键字的含义是什么?

c++ - 为什么 C++ 不使用 std::nested_exception 来允许从析构函数中抛出?

java - 如果一行中结果不为空,则附加到字符串? (干净/好看)

c++ - "Declaration of xxx outside of class is not definition"错误