共用方式為


成員的指標

成員指標宣告是特殊的指標宣告。函式是使用下列序列宣告:

[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier] 
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
  1. 宣告規範:

    • 選擇性的儲存類別規範。

    • 選擇性的 const 和 (或) volatile 規範。

    • 類型指定名稱:類型的名稱。這是指向成員的類型,而不是類別的類型。

  2. 宣告子:

    • 選擇性的 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*。 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 );

請參閱

參考

C++ 抽象宣告子