次の 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
(基本的に) を返すだけで、スタックに余分な変数のオーバーヘッドが発生する明示的な関数を使用する理由は何ですか?