考虑以下 Qt 类:
#include <QScopedPointer>
class MyClassPrivate;
class MyClass
{
public:
MyClass();
~MyClass();
private:
QScopedPointer<MyClassPrivate> d_ptr;
Q_DECLARE_PRIVATE(MyClass)
}
此类类似于大多数实现私有实现的 Qt 类的结构。该宏Q_DECLARE_PRIVATE
将导致以下扩展(从 Qt5 开始):
inline MyClassPrivate* d_func()
{ return reinterpret_cast<MyClassPrivate *>(qGetPtrHelper(d_ptr)); }
inline const MyClassPrivate* d_func() const
{ return reinterpret_cast<const MyClassPrivate *>(qGetPtrHelper(d_ptr)); }
friend class MyClassPrivate;
这令人困惑——为什么不d_ptr
直接在成员函数中使用?换句话说,而不是这样做:
Q_D(MyClass);
d->member = 12345;
为什么不这样做?
d_ptr->member = 12345;
有一个显式函数(基本上)只返回d_ptr
并在堆栈上产生额外变量的开销的原因是什么?