Ponteiros para membros

Declarações de ponteiros para os membros são casos especiais de declarações do ponteiro.Elas são declaradas usando a seguinte seqüência:

[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
  1. O especificador de declaração:

    • Um especificador de classe de armazenamento opcional.

    • Opcional const e/ou volatile especificadores.

    • O especificador de tipo: o nome de um tipo.Este é o tipo do membro a ser apontado, não a classe.

  2. O Declarador:

    • Um modificador de específico Microsoft opcional.Para obter mais informações, consulte Modificadores específicas da Microsoft.

    • O nome qualificado da classe que contém os membros a ser apontada.Consulte nomes e nomes qualificados.

    • O:: operador.

    • O * operador.

    • Opcional const e/ou volatile especificadores.

    • O identificador de nomear o ponteiro para o membro.

    • Um inicializador opcional:

O = operador.

O & operador.

O nome qualificado da classe.

O :: operador.

O nome de um membro não estático da classe do tipo apropriado.

Como sempre, a vários declaradores (e qualquer inicializadores associados) são permitidos em uma única declaração.

Um ponteiro para um membro de uma classe difere de um ponteiro normal, pois ele tem informações de tipo para o tipo do membro e para a classe à qual o membro pertence.Um ponteiro normal identifica (tem o endereço do) apenas um único objeto na memória.Um ponteiro para um membro de uma classe identifica esse membro em qualquer instância da classe.O exemplo a seguir declara uma classe, Windowe alguns ponteiros para dados de membro.

// 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()
{
}

No exemplo anterior, pwCaption é um ponteiro para qualquer membro da classe Window que tem o tipo de char *.The type of pwCaption is char * Window::*.O fragmento de código próximo declara ponteiros para o SetCaption e GetCaption funções de membro.

const char * (Window::*pfnwGC)() = &Window::GetCaption;
bool (Window::*pfnwSC)( const char * ) = &Window::SetCaption;

Os ponteiros pfnwGC e pfnwSC aponte para GetCaption e SetCaption da Window classe, respectivamente.O código copia as informações para a legenda da janela diretamente usando o ponteiro para o membro 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';

A diferença entre a . * e – > * operadores (os operadores de ponteiro para membro) é que o . * operador seleciona membros devido a um objeto ou uma referência de objeto, enquanto o – > * operador seleciona membros através de um ponteiro.(Para obter mais informações sobre esses operadores, consulte expressões com operadores de ponteiro para o membro.)

O resultado dos operadores de ponteiro para membro é o tipo do membro — nesse caso, char *.

O fragmento de código a seguir chama as funções de membro GetCaption e SetCaption usando ponteiros para os membros:

// 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 );

Consulte também

Referência

Resumo de C++ declaradores