指向成員的指標
宣告指向成員的指標是特殊的情況,指標宣告。 這些就是使用下列程序的宣告:
[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
宣告規範中:
選擇性儲存類別規範。
選擇性 const 及 (或) volatile規範。
型別規範: 型別名稱。 這是必須指出,成員的型別不是類別。
宣告子:
選擇性 Microsoft 特定輔助。 如需詳細資訊,請參閱 Microsoft 專屬的修飾詞。
包含指向成員的類別限定的名稱。 請參閱名稱和限定的名稱。
:: 運算子。
* 運算子。
選擇性 const 及 (或) volatile規範。
命名成員指標識別項。
選擇性的初始設定式:
= 運算子。
與運算子。
類別的限定的名稱。
:: 運算子。
非靜態成員的適當型別的類別名稱。
如同以往一樣,多個宣告子 (以及任何相關聯的初始設定式) 中允許有單一的宣告。
從正常的滑鼠指標的變數的指標,類別成員不同,因為它具有成員的型別和成員屬於類別的型別資訊。 正常的滑鼠指標的識別 (具有位址) 只有一個物件在記憶體中的。 變數的指標,類別的成員會識別該類別的任何執行個體中的成員。 下列範例會宣告為類別, 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類別的任何成員是指向Window用具有型別的 char *。 The type of pwCaption is char * Window::*. 下一步的程式碼片段會宣告指標SetCaption和GetCaption成員函式。
const char * (Window::*pfnwGC)() = &Window::GetCaption;
bool (Window::*pfnwSC)( const char * ) = &Window::SetCaption;
指標pfnwGC和pfnwSC指向GetCaption和SetCaption的Window類別,分別。 程式碼會將資訊複製到直接使用成員的指標,視窗標題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 );