请考虑以下代码:
#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
类型的变量?
答案 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) {}
}