在檢視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...