Указателей на члены
Объявления указателей на члены особые случаи объявления указателя.Они объявлены, используя следующую последовательность:
[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
описатель объявления:
Необязательный описатель класса хранения.
Необязательно Const и/или volatile описатели.
Описатель типа: имя типа.Это тип члена, который необходимо указывать на, а не класс.
декларатор:
Необязательный модификатор, характерной для Майкрософт.Дополнительные сведения см. в разделе модификаторы Майкрософт-Специфического.
Полное имя класса, содержащий элементы, которые нужно указать.См. Имена и полные имена.
:: оператор.
* оператор.
Необязательно 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 );