Qt 類的成員變數

2021-10-19 12:02:42 字數 2415 閱讀 9599

在檢視qt的原始碼時候,發現qt會將資料單獨抽象成乙個class##private 類,所有的成員變數的都是由這個類來儲存的。

例如:qthread 類,可以看到從表面上沒有看到任何成員變數,那我們就來看看qt是如何巧妙的來完成這個內容的。

class q_core_export qthread : public qobject

;

template inline t *qgetptrhelper(t *ptr) 

template inline auto qgetptrhelper(const ptr &ptr) -> decltype(ptr.operator->())

// the body must be a statement:

#define q_cast_ignore_align(body) qt_warning_push qt_warning_disable_gcc("-wcast-align") body qt_warning_pop

// 巨集

#define q_declare_private(class) \

inline class##private* d_func() \

\inline const class##private* d_func() const \

\friend class class##private;

2個內聯函式,返回時class##private* 的指標。

inline class##private* d_func()

inline const class##private* d_func() const

為了讓class##private 可以訪問私有函式,設定為友元類。

friend class class##private;

qgetptrhelper的作用是通過模板方式將指標或者物件,轉換成指標。

其中d_ptr 是qobject的成員變數的指標,是在類建構函式賦值的,也就class##private 類。所以我們也就知道在建立qthread類的時候,qthread會建立乙個包含資料成員的類qthreadprivate

qobject::qobject(qobjectprivate &dd, qobject *parent)

: d_ptr(&dd)

qthread::qthread(qobject *parent)

: qobject(*(new qthreadprivate), parent)

通過第一節的講解之後,我們知道了,類是通過class##private 類物件儲存到d_ptr中的,那如何訪問和使用呢,就會用到下面的巨集。也就是d_func() 返回乙個class##private * 型別的指標。

#define q_d(class) class##private * const d = d_func()
所以訪問成員變數就可以直接使用d->data->thread 的方式直接訪問。

qthread::qthread(qobject *parent)

: qobject(*(new qthreadprivate), parent)

接下來我看一下,在qthreadprivate中是如何訪問qthread的

首先:classprivate都是繼承與qobjectprivate的

第二:和q_declare_private 相對的有q_declare_public的巨集就為了訪問class 。形式一樣不做過多的介紹。

#define q_declare_public(class)                                    \

inline class* q_func() \

inline const class* q_func() const \

friend class class;

class qthreadprivate : public qobjectprivate

static qthread *threadforid(int)

static qabstracteventdispatcher *createeventdispatcher(qthreaddata *data);

void ref() {}

void deref() {}

q_declare_public(qthread)

};

1、為什麼會這樣做

由於qthread類是q_core_export ,是匯出類,外部可以可以看到類的宣告包括內部變數,但是內部的資料是不希望被外部看到的,所以將所有的資料成員變數封裝成乙個私有類,不暴露實現細節的目的。

2、通過巨集q_declare_private 來宣告,q_d來訪問。

成員變數,類變數,成員方法,類方法

成員變數 包括例項變數和類變數,用static修飾的是類變數,不用static修飾的是例項變數,所有類的成員變數可以通過this來引用。類變數 靜態域,靜態字段,或叫靜態變數,它屬於該類所有例項共有的屬性。而且所有的例項都可以修改這個類變數的值 這個類變數沒有被final修飾的情況 而且訪問類變數的...

C 類的成員變數

類的宣告中類的主體 通常包含類的成員變數和成員方法.宣告成員變數的語法如下 訪問修飾符 資料型別 成員變數 成員變數命名規範如下 如果是公共成員變數 受保護的成員變數 內部成員變數,使用駱駝命名法,如name,gender等。如果是私有成員變數,使用駱駝命名法,並以下劃線開頭。如 age,score...

C 類的成員變數

類的宣告中類的主體 通常包含類的成員變數和成員方法.宣告成員變數的語法如下 訪問修飾符 資料型別 成員變數 成員變數命名規範如下 如果是公共成員變數 受保護的成員變數 內部成員變數,使用駱駝命名法,如name,gender等。如果是私有成員變數,使用駱駝命名法,並以下劃線開頭。如 age,score...