为什么我可以将QObject *分配给QObject?

时间:2015-05-19 09:59:21

标签: c++ qt explicit-constructor

请考虑以下代码:

#include <QObject>

class A : public QObject
{
    Q_OBJECT
    public: 
        A(QObject* parent = 0) : QObject(parent) {}
}

int main()
{
    A a = new A();
    return 0;
}

为什么我可以在没有编译器(或运行时)抱怨的情况下将A*类型的对象分配给A类型的变量?

1 个答案:

答案 0 :(得分:4)

在此代码中,A的构造函数用于A* 转换为A类型的对象,而不是分配< / em>它。通常,允许编译器隐式使用匹配构造函数作为转换运算符,因此以下是合法代码:

struct B
{
    B(int i){}
}
int main()
{
    B b = 5;
    return 0;
}

在问题代码中,A*运算符生成的未命名new用作parent构造函数的A参数。这是允许的,因为A派生自QObject(因此匹配参数列表)。但是,这显然是不受欢迎的行为,因为a不是new返回的对象,而是类型A的对象是该对象的父级。 (此外,new&#39; ed对象永远不会delete d,从而导致内存泄漏。)

为防止出现这种细微错误,通常建议使用QObject - 派生类explicit的构造函数来防止编译器误用它作为转换运算符。 (这也适用于类似的情况,不仅适用于Qt。) 使用以下修改后的代码,编译器将捕获错误:

class A : public QObject
{
    Q_OBJECT
    public: 
        explicit A(QObject* parent = 0) : QObject(parent) {}
}