Поделиться через


Указатели на члены

Объявления указателей на члены — это особый случай объявлений указателей. Они объявляются с помощью следующей последовательности:

[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 указывают на функции 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 );

См. также

Ссылки

Абстрактные деклараторы в C++