指向成员的指针

指向成员的指针的声明是指针声明的特例。使用以下序列来声明它们:

[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 是一个指针,它指向具有 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 );

请参见

参考

C++ 抽象声明符