到目前为止,我还没有找到确切的答案。什么时候从对象中调用 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/