考虑以下代码:
#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
类型的变量,而编译器(或运行时)不会提示?
最佳答案
在这段代码中,A
的构造函数用于转换 A*
到 A
类型的对象,而不是分配它。通常允许编译器隐式地使用匹配的构造函数作为转换运算符,因此下面是合法的代码:
struct B
{
B(int i){}
}
int main()
{
B b = 5;
return 0;
}
在问题的代码中,未命名的A*
来自 new
的结果运算符用作 parent
A
的构造函数参数.这是允许的,因为 A
源自 QObject
(因此匹配参数列表)。然而,这显然是不受欢迎的行为,因为 a
不是 new
返回的对象,而是一个 A
类型的对象该对象的父级。
(此外,new
编辑的对象永远不会是 delete
d,导致内存泄漏。)
为了防止这种细微的错误,一般建议构造QObject
的构造函数-派生类 explicit
以防止编译器将其误用作转换运算符。 (这也适用于类似的情况,不仅适用于 Qt。)
使用以下修改后的代码,编译器将捕获错误:
class A : public QObject
{
Q_OBJECT
public:
explicit A(QObject* parent = 0) : QObject(parent) {}
}
关于c++ - 为什么我可以将 QObject* 分配给 QObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30322423/