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


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

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

[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
  1. описатель объявления:

    • Необязательный описатель класса хранения.

    • Необязательно Const и/или volatile описатели.

    • Описатель типа: имя типа.Это тип члена, который необходимо указывать на, а не класс.

  2. декларатор:

    • Необязательный модификатор, характерной для Майкрософт.Дополнительные сведения см. в разделе модификаторы Майкрософт-Специфического.

    • Полное имя класса, содержащий элементы, которые нужно указать.См. Имена и полные имена.

    • :: оператор.

    • * оператор.

    • Необязательно 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 и SetCaptionWindow класс соответственно.Код копирует данные в заголовок окна непосредственно с помощью указателя на член 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++