gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:57:32 32 4
gpt4 key购买 nike

考虑以下代码:

#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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com