メンバーへのポインター
メンバーへのポインターの宣言は、ポインター宣言の特殊なケースです。 これらは次のシーケンスで宣言します。
[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
宣言指定子:
ストレージ クラスの指定子 (省略可能)。
const/volatile 指定子 (省略可能)。
型指定子: 型の名前。 これは指されるメンバーのクラスではなく、種類です。
宣言子:
オプションの Microsoft 固有の修飾子。 詳細については、「Microsoft 固有の修飾子」を参照してください。
指されるメンバーが含まれるクラスの修飾名。 「Names and Qualified Names (名前と修飾名)」を参照してください。
:: 演算子。
* 演算子。
const/volatile 指定子 (省略可能)。
メンバーへのポインターを指定する識別子。
初期化子 (省略可能):
= 演算子。
& 演算子。
クラスの修飾名。
:: 演算子。
適切な型のクラスの非静的メンバーの名前。
当然ながら、1 つの宣言で複数の宣言子 (および関連する初期化子) を使用できます。
クラスのメンバーへのポインターは、メンバーの型およびメンバーが属するクラスの情報を持つ点で通常のポインターとは異なります。 通常のポインターは、メモリ内の 1 つのオブジェクトだけを識別します (1 つのオブジェクトのアドレスだけを持ちます)。 クラスのメンバーへのポインターは、クラスのインスタンスのメンバーを識別します。 次の例では、Window クラス、およびメンバー データへのポインターをいくつか宣言します。
// pointers_to_members1.cpp
class Window
{
public:
Window(); // Default constructor.
Window( int x1, int y1, // Constructor specifying
int x2, int y2 ); // window size.
bool SetCaption( const char *szTitle ); // Set window caption.
const char *GetCaption(); // Get window caption.
char *szWinCaption; // Window caption.
};
// Declare a pointer to the data member szWinCaption.
char * Window::* pwCaption = &Window::szWinCaption;
int main()
{
}
上の例で、pwCaption は、char* 型を持つ Window クラスのメンバーへのポインターです。 pwCaption の型は char * Window::* です。 次のコードでは、メンバー関数 SetCaption および GetCaption へのポインターを宣言します。
const char * (Window::*pfnwGC)() = &Window::GetCaption;
bool (Window::*pfnwSC)( const char * ) = &Window::SetCaption;
ポインター pfnwGC および pfnwSC はそれぞれ、Window クラスの GetCaption および SetCaption を指します。 次のコードは、メンバー pwCaption へのポインターを使用してウィンドウ キャプションに情報を直接コピーします。
Window wMainWindow;
Window *pwChildWindow = new Window;
char *szUntitled = "Untitled - ";
int cUntitledLen = strlen( szUntitled );
strcpy_s( wMainWindow.*pwCaption, cUntitledLen, szUntitled );
(wMainWindow.*pwCaption)[cUntitledLen - 1] = '1'; //same as
//wMainWindow.SzWinCaption [cUntitledLen - 1] = '1';
strcpy_s( pwChildWindow->*pwCaption, cUntitledLen, szUntitled );
(pwChildWindow->*pwCaption)[cUntitledLen - 1] = '2'; //same as //pwChildWindow->szWinCaption[cUntitledLen - 1] = '2';
.* 演算子と –>* 演算子 (メンバーへのポインター演算子) の違いは、.* 演算子はオブジェクトまたはオブジェクト参照を指定されたメンバーを選択し、–>* 演算子はポインターを通じてメンバーを選択することです (これらの演算子の詳細については、「メンバーへのポインター演算子を含む式」を参照してください)。
メンバーへのポインター演算子の結果は、メンバーの型 (この例では char *) です。
次のコードでは、メンバーへのポインターを使用して、メンバー関数 GetCaption および SetCaption を呼び出します。
// Allocate a buffer.
enum {
sizeOfBuffer = 100
};
char szCaptionBase[sizeOfBuffer];
// Copy the main window caption into the buffer
// and append " [View 1]".
strcpy_s( szCaptionBase, sizeOfBuffer, (wMainWindow.*pfnwGC)() );
strcat_s( szCaptionBase, sizeOfBuffer, " [View 1]" );
// Set the child window's caption.
(pwChildWindow->*pfnwSC)( szCaptionBase );