QObject的拷貝建構函式與賦值運算子

2021-09-25 12:24:35 字數 1637 閱讀 1095

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

在qt的物件模型中,qobject被當做標識對待,不是值,所以不能複製,這和拷貝建構函式的定義是衝突的,所以oqbject沒有拷貝建構函式,或者說qobject的拷貝建構函式不能呼叫。來,看看**,加深理解。

拷貝建構函式的一般形式為:t(const t& t)

**1:

#include 

int main(int argc, char *ar**)

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 

int main(int argc, char *ar**)

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指標傳遞,而不能使用值傳遞。

QObject 的拷貝構造和賦值操作

qoject 中沒有提供乙個拷貝建構函式和賦值操作符給外界使用,其實拷貝構造和賦值的操作都是已經宣告了的,但是它們被使用了q disable copy 巨集放在了private區域。因此所有繼承自qobject的類都使用這個巨集宣告了他們的拷貝建構函式和賦值操作符為私有。為什麼要這樣做?我們都知道q...

重點 QObject 的拷貝構造和賦值操作 私有

qobject 中沒有提供乙個拷貝建構函式和賦值操作符給外界使用,其實拷貝構造和賦值的操作都是已經宣告了的,但是它們被使用了q disable copy 巨集放在了private區域。因此所有繼承自qobject的類都使用這個巨集宣告了他們的拷貝建構函式和賦值操作符為私有。為什麼要這樣做?我 們都知...

拷貝建構函式與賦值建構函式

include stdafx.h include include using namespace std class a a a a 過載拷貝函式 a int id,char t name a char name a operator a a 注意 此處一定要返回物件的引用,否則返回後其值立即消失!...