您好,登錄后才能下訂單哦!
本文主要是針對QObject的拷貝構(gòu)造函數(shù)和賦值運算符進(jìn)行說明。先來看一下拷貝構(gòu)造函數(shù)定義:拷貝構(gòu)造函數(shù),又稱復(fù)制構(gòu)造函數(shù),是一種特殊的構(gòu)造函數(shù),它由編譯器調(diào)用來完成一些基于同一類的其他對象的構(gòu)建及初始化。其唯一的形參必須是引用,但并不限制為const,一般普遍的會加上const限制。此函數(shù)經(jīng)常用在函數(shù)調(diào)用時用戶定義類型的值傳遞及返回??截悩?gòu)造函數(shù)要調(diào)用基類的拷貝構(gòu)造函數(shù)和成員函數(shù)。如果可以的話,它將用常量方式調(diào)用,另外,也可以用非常量方式調(diào)用。
還記得《[QT入門篇]1 QT中的對象模型》中的說明么?QObject被當(dāng)做標(biāo)識對待,不是值,所以不能復(fù)制,這和拷貝構(gòu)造函數(shù)的定義是沖突的,所以O(shè)Qbject沒有拷貝構(gòu)造函數(shù),或者說QObject的拷貝構(gòu)造函數(shù)不能調(diào)用。來,看看代碼,加深理解。
拷貝構(gòu)造函數(shù)的一般形式為: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&)是私有的,不能調(diào)用。跟蹤到OQbject.h中能看到這樣的定義:
……
private:
Q_DISABLE_COPY(QObject)
……
毫無疑問,QT把QObject的拷貝構(gòu)造函數(shù)干掉了。同理,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;
……
總結(jié)一下:QObject既沒有拷貝構(gòu)造函數(shù)也沒有賦值運算符。QT的設(shè)計即是如此。實際上,這兩者都被聲明了,只不過它們使用了Q_DISABLE_COPY宏并在類的私有段聲明的。QObject所有的直接子類和間接子類都沒有拷貝構(gòu)造函數(shù)和賦值運算符。
這樣做的結(jié)果是,開發(fā)者在某些場景下需要使用OQbject作為“值”時,必須使用QObject指針傳遞,而不能使用值傳遞。
QT為了防止開發(fā)人員出錯也是煞費苦心啊~
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。