[Q学习]3 QObject的拷贝构造函数与赋值运算符
来源:互联网 发布:用java打印对称三角形 编辑:程序博客网 时间:2024/05/17 20:30
本文主要是针对QObject的拷贝构造函数和赋值运算符进行说明。先来看一下拷贝构造函数定义:拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的形参必须是引用,但并不限制为const,一般普遍的会加上const限制。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。
在Qt的对象模型中,QObject被当做标识对待,不是值,所以不能复制,这和拷贝构造函数的定义是冲突的,所以OQbject没有拷贝构造函数,或者说QObject的拷贝构造函数不能调用。来,看看代码,加深理解。
拷贝构造函数的一般形式为:T(const T& t)
代码1:
#include <QCoreApplication>
#include <QObject>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QObject x;
x.setObjectName("x");
QObject y(x);
return a.exec();
}
编译时,提示“QObject y(x);”有错误:
=========================================
E:\Qt\Qt5.6.0\5.6\mingw49_32\include\QtCore\qobject.h:461: error: 'QObject::QObject(const QObject&)' is private
Q_DISABLE_COPY(QObject)
^
========================================
从错误提示中,我们能够看出QObject::QObject(const QObject&)是私有的,不能调用。跟踪到OQbject.h中能看到这样的定义:
……
private:
Q_DISABLE_COPY(QObject)
……
毫无疑问,QT把QObject的拷贝构造函数干掉了。同理,QObject的“=”运算符也是一样被干掉了,看下面的代码:
代码2:
#include <QCoreApplication>
#include <QObject>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QObject x;
x.setObjectName("x");
QObject y;
y = x;
return a.exec();
}
编译时,“y=x”报错:
========================
E:\Qt\Qt5.6.0\5.6\mingw49_ 'QObject& QObject::operator=(const QObject&)' is private
Class &operator=(const Class &) Q_DECL_EQ_DELETE;
======================
“=”运算符也被置为私有,在qglobal.h中有这样的定义:
……
#define Q_DISABLE_COPY(Class) \
Class(const Class &) Q_DECL_EQ_DELETE;\
Class &operator=(const Class &) Q_DECL_EQ_DELETE;
……
总结一下:QObject既没有拷贝构造函数也没有赋值运算符。QT的设计即是如此。实际上,这两者都被声明了,只不过它们使用了Q_DISABLE_COPY宏并在类的私有段声明的。QObject所有的直接子类和间接子类都没有拷贝构造函数和赋值运算符。
这样做的结果是,开发者在某些场景下需要使用OQbject作为“值”时,必须使用QObject指针传递,而不能使用值传递。
QT为了防止开发人员出错也是煞费苦心啊~
- [Q学习]3 QObject的拷贝构造函数与赋值运算符
- 拷贝构造函数与赋值运算符的重载函数
- 拷贝构造函数与赋值运算符
- 拷贝构造函数与赋值运算符
- 拷贝构造函数与赋值运算符
- 重载赋值运算符与拷贝构造函数的区别
- 拷贝构造函数与赋值运算符重载的区别
- 拷贝构造函数与赋值运算符的区别
- 拷贝构造函数与赋值运算符重载的区别
- 重载赋值运算符与拷贝构造函数的区别
- 重载赋值运算符与拷贝构造函数的区别
- 拷贝构造函数与赋值运算符重载的区别
- 拷贝构造函数,类的赋值运算符重载,深拷贝与浅拷贝
- QObject 的拷贝构造和赋值操作
- QObject 的拷贝构造和赋值操作
- c++拷贝构造函数与赋值运算
- Cpp--拷贝构造函数与赋值运算符重载函数的区别与使用
- 默认构造函数,拷贝构造函数,拷贝赋值运算符
- 经过AVL单旋转,任意二叉查找树T1可以变换成另一颗(具有相同关键字的)查找树T2
- 白话空间统计二十一:密度分析番外:公交广告投放
- UIImageView有时候设置contentMode不管用
- 【技巧】修改windows10在高分屏下的应用的dpi
- 关于指针的小杂碎
- [Q学习]3 QObject的拷贝构造函数与赋值运算符
- IPC基础
- 数学推公式题
- string
- 值对象
- Java 方法
- C语言中一类特殊的数组越界!!
- 数据结构之排序:希尔排序
- 自己写的五子棋