Compartir a través de


Punteros a miembros

Las declaraciones de punteros a miembros son casos especiales de declaraciones de puntero.Se declaran con la secuencia siguiente:

[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
  1. El especificador de declaración:

    • Un especificador opcional de clase de almacenamiento.

    • const opcional o especificadores de volatile .

    • El especificador de tipo: el nombre de un tipo.Éste es el tipo de miembro que se señalice, no a la clase.

  2. El declarador:

    • Un modificador opcional específico de Microsoft.Para obtener más información, vea Modificadores específicos.

    • El nombre completo de la clase que contiene miembros que se señale a.Vea nombres y nombres calificados.

    • :: operador.

    • el operador de * .

    • const opcional o especificadores de volatile .

    • El identificador que llama al puntero a miembro.

    • un inicializador opcional:

el operador de = .

y operador.

El nombre completo de la clase.

Operador ::.

El nombre de un miembro no estático de la clase del tipo adecuado.

Como siempre, los declarantes varias (y cualquier inicializadores asociado) se permiten en una sola declaración.

Un puntero a un miembro de una clase diferencia de un puntero normal porque tiene información de tipos para el tipo de miembro y para la clase a la que el miembro pertenece.Un puntero normal identifica (tiene la dirección de) solo un objeto en memoria.Un puntero a un miembro de una clase identifica ese miembro en cualquier instancia de la clase.El ejemplo siguiente declara una clase, Window, y algunos punteros a los datos de miembros.

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

En el ejemplo anterior, pwCaption es un puntero a cualquier miembro de la clase Window que ha escrito char*.el tipo de pwCaption es char * Window::*.El siguiente fragmento de código declara punteros a SetCaption y el miembro de GetCaption funciona.

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

los punteros pfnwGC y punto de pfnwSC a GetCaption y a SetCaption de la clase de Window , respectivamente.La información de las copias del código a la leyenda de la ventana directamente mediante el puntero a miembro 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';

La diferencia entre . * y operadores de – >* (operadores de puntero a miembro) es que el operador de . * selecciona los miembros con un objeto o una referencia de objeto, mientras que el operador de – >* selecciona los miembros a través de un puntero.(Para obtener más información sobre estos operadores, vea Expresiones con operadores de puntero a miembro.)

El resultado de los operadores de puntero a miembro es el tipo de miembro (en este caso, char *.

El fragmento de código siguiente invoca las funciones GetCaption y SetCaption miembro mediante punteros a miembros:

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

Vea también

Referencia

Declarantes de resumen de C++