91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

[QT入門篇]3 QObject的拷貝構造函數與賦值運算符

發布時間:2020-07-22 06:11:55 來源:網絡 閱讀:2053 作者:taohe_0 欄目:開發技術

本文主要是針對QObject的拷貝構造函數和賦值運算符進行說明。先來看一下拷貝構造函數定義:拷貝構造函數,又稱復制構造函數,是一種特殊的構造函數,它由編譯器調用來完成一些基于同一類的其他對象的構建及初始化。其唯一的形參必須是引用,但并不限制為const,一般普遍的會加上const限制。此函數經常用在函數調用時用戶定義類型的值傳遞及返回。拷貝構造函數要調用基類的拷貝構造函數和成員函數。如果可以的話,它將用常量方式調用,另外,也可以用非常量方式調用。

還記得《[QT入門篇]1 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為了防止開發人員出錯也是煞費苦心啊~


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嵊州市| 海盐县| 新晃| 治县。| 闽侯县| 香港| 阿合奇县| 吉木萨尔县| 冷水江市| 绥化市| 昆山市| 汝阳县| 维西| 鄂伦春自治旗| 淅川县| 应城市| 花莲县| 峨眉山市| 汉中市| 西乌珠穆沁旗| 新巴尔虎右旗| 汪清县| 清涧县| 逊克县| 化州市| 三江| 兴隆县| 宜昌市| 宝丰县| 同仁县| 海晏县| 谷城县| 太康县| 江油市| 修文县| 滕州市| 常德市| 耒阳市| 西宁市| 从化市| 米脂县|