在构造函数的初始化列表中使用“this”对 Qt 特别危险吗?

Lal*_*Box 6 c++ qt constructor this-pointer initialization-list

我需要关于“这个”主题的可靠信息:

class MyClass, public QWidget
{
public:
    MyClass( QWidget * parent = NULL )
         :QWidget( parent ),
         mpAnotherWidget( new QWidget( this ) ){};
private:
    QWidget * mpAnotherWidget;
};
Run Code Online (Sandbox Code Playgroud)

当然,在构造函数或初始化列表中调用虚函数是一个坏主意。问题是:这个代码可以吗

mpAnotherWidget( new QWidget( this ) )
Run Code Online (Sandbox Code Playgroud)

导致未定义的行为?!如果是这样:为什么?

如果可以,请引用您的来源!谢谢!

Dav*_*eas 4

这取决于QWidget给定的指针的作用。只要被调用的代码不访问底层对象,就可以将引用或指针传递给半构造对象。您需要查看文档以QWidget了解它是接触对象还是仅存储指针。


在 Qt 的特定情况下,阅读文档,它正在调用 的构造函数QWidget,参数的类型为QWidget*,并且this仅用于转换为基指针。在 12.7/3 中保证获得指向基数的指针,因为转换的要求是X 的构造以及直接或间接从 B 派生的所有其直接或间接基数的构造应已开始。然后,该指针被传递给QWidget可以以任何想要的方式使用它的构造函数,因为基类的构造函数QWidget已经在启动构造函数之前完成mpAnotherWidget