在研究QCoreApplication類的代碼時,無意間弄明白了“d_func()”和“d指針”的來源:
class Q_CORE_EXPORT QCoreApplication
#ifndef QT_NO_QOBJECT
: public QObject
#endif
{
……
Q_DECLARE_PRIVATE(QCoreApplication)
public:
……
~QCoreApplication();
……
protected:
QCoreApplication(QCoreApplicationPrivate &p);
#ifdef QT_NO_QOBJECT
QScopedPointer<QCoreApplicationPrivate> d_ptr;
#endif
};
上面的代碼中出現了一個紅“Q_DECLARE_PRIVATE”,接下來看看這個宏的作用。
template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }
template <typename Wrapper> static inline typename Wrapper::pointer\
qGetPtrHelper(const Wrapper &p) { return p.data(); }
#define Q_DECLARE_PRIVATE(Class) \
inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \
inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \
friend class Class##Private;
發現這個展開后引入了d_func()這個函數。但是“d指針”和這個宏又有什么關系呢?那就要說到另一個宏“Q_D”看如下的代碼
#define Q_D(Class) Class##Private * const d = d_func()
從代碼中可知,d_func()和d指針是緊密聯系的。在Qt源碼中“d_func()函數”和“d指針”的使用無處不在!
在接下的過程中又發現了另一組宏“Q_DECLARE_PUBLIC、Q_Q”,代碼如下:
#define Q_DECLARE_PUBLIC(Class) \
inline Class* q_func() { return static_cast<Class *>(q_ptr); } \
inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \
friend class Class;
#define Q_Q(Class) Class * const q = q_func()
這組宏引入了“q_func()函數”和“q指針”,這兩個在Qt代碼中遇見較少,留待以后研究。
http://qtdream.com/topic/257/qt%E4%B8%AD%E6%97%A0%E5%A4%84%E4%B8%8D%E5%9C%A8%E7%9A%84d%E6%8C%87%E9%92%88%E4%B8%BA%E4%BD%95%E6%96%B9%E7%A5%9E%E5%9C%A3/4
-------------------------------------------------------------------------------
這個是pimpl模式,Qt廣泛使用。簡而言之,就是不讓你知道這個類的私有成員是怎樣的,有利於信息的隱藏以及高低版本的兼容。
可以看看這兩篇博文
http://blog.csdn.net/mznewfacer/article/details/6976293
http://blog.csdn.net/zhu_xz/article/details/6035861