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

标签 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 类型的变量,而编译器(或运行时)不会提示?

最佳答案

在这段代码中,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/

相关文章:

c++ - 访问一个类的成员。此类的对象从未实例化。所有成员都是静态类型

c++ - 隐式定义的类的析构函数

C++11 initializer_list 构造函数标记为 "explicit"

c++ - 我可以转换对象并访问 C++ 中的私有(private)数据成员吗?

c++ - gdb 上的 "No frame is currently executing in specified block"错误

C++理解循环双向链表

qt - 如何将 QProgressBar 添加到 QMenuBar?

c++ - 实现一个类似于 Qt 的高性能互斥锁

python - 如何控制QTableView上的排序箭头指示器

c++ - 来自 T* 的 std::unique_ptr<T> 的构造函数是显式的背后的原因是什么?