为什么QWidget widget = QWidget();qt编译不通过

QWidget widget = QWidget();为什么这样qt就编译不通过

为什么int d = int();qt编译通过;


private:
    Q_DISABLE_COPY(QWidget)

这是QWidget.h中的内容,这句话有两个意思:1.QWidget的拷贝构造函数是private类型,2.禁用QWidget的拷贝构造函数,而QWidget widget = QWidget();会调用拷贝构造函数,所以会报错。
int d = int()这里,int是基本类型,不是类,也就没有拷贝构造函数一说,也就是个强制类型转换,所以能编译通过。

因为QObject把拷贝构造函数和拷贝赋值函数都禁用了,所有QObject及从QObject派生的派生类的对象都是不能拷贝的。

你这样写肯定报错啊,都没有这样定义的语法。
而且QWidget();根本没有这样的函数用于返回Qwidget对象。
int() 是你自己定义的函数,里面返回一个int类型数据,然后你再用int类型变量去接收,所以这样是可以的。
你只能这样去写:QWidget *widget = new QWidget(); 或者 QWidget widget;
我去看了一下QT的帮助文档,没有QWidget()这样的函数方法,所以你那些写肯定会报错!

img

img

img

报错很明确,QWidget的无参构造函数是private的
你看看它是不是有多个重载,应该需要你传入参数的

img

img


大意:
禁用对给定类使用复制构造函数和赋值操作符。
**QObject子类的实例不应该被认为是可以复制或赋值的值,而应该被认为是唯一的标识。**这意味着当您创建自己的QObject子类(指导或间接)时,您不应该给它一个复制构造函数或赋值操作符。 然而,仅仅从类中省略它们可能还不够,因为如果您错误地编写了一些需要复制构造函数或赋值操作符的代码(这很容易做到),您的编译器将为您精心创建它。 你必须做得更多。
好奇的用户会发现,从QObject派生的Qt类通常会在private section中包含这个宏:
它在私有部分中声明了复制构造函数和赋值操作符,因此如果你错误地使用了它们,编译器就会报告错误。
但即便如此,这可能也不能完全适用于所有情况。 你可能会这样做:
首先,不要这样做。 大多数编译器会生成使用复制构造函数的代码,因此会报告隐私侵犯错误,但你的c++编译器不需要以特定的方式为这个语句生成代码。 它既不能使用复制构造函数,也不能使用我们设置为private的赋值操作符生成代码。 在这种情况下,不会报告任何错误,但是当您调用w的成员函数时,您的应用程序可能会崩溃。
查了很多资料最终发现问题的本质是:为什么复制构造函数与赋值是不允许的?原作者链接:

https://blog.csdn.net/zhjixi495/article/details/103197312
截取其中部分图:

img