Puntatori ai membri
Le dichiarazioni dei puntatori ai membri sono casi speciali delle dichiarazioni del puntatore.Vengono dichiarati utilizzando la seguente sequenza:
[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
L'identificatore della dichiarazione:
Un identificatore facoltativo della classe di archiviazione.
facoltativo const e/o volatile identificatori.
L'identificatore del tipo: il nome di un tipo.Si tratta del tipo di membro da puntare su, non la classe.
il dichiaratore:
un modificatore specifico facoltativo di Microsoft.Per ulteriori informazioni, vedere Modificatori specifici microsoft.
Il nome completo della classe che contiene membri da puntare a.vedere nomi e nomi completi.
:: operatore.
* operatore.
facoltativo const e/o volatile identificatori.
L'identificatore di denominazione del puntatore a membro.
un inizializzatore facoltativo:
= operatore.
& operatore.
Il nome completo della classe.
Operatore ::.
Il nome di un membro non statico della classe del tipo appropriato.
Come sempre, i dichiaratori più (e gli inizializzatori associati) sono consentiti in una sola dichiarazione.
Un puntatore A un membro di una classe differisce da un puntatore normale perché contiene informazioni sul tipo per il tipo di membro e per la classe a cui il membro appartiene.Un puntatore normale identifica (con l'indirizzo di) un solo oggetto in memoria.Un puntatore A un membro di una classe identifica tale membro in qualsiasi istanza della classe.Nell'esempio seguente viene dichiarata una classe, Windowe gli eventuali puntatori ai dati dei membri.
// 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()
{
}
Nell'esempio precedente, pwCaption è un puntatore a un membro di classe Window ciò è di tipo argomento char*.il tipo di pwCaption viene char * Window::*.Il frammento di codice seguente dichiara i puntatori a SetCaption e GetCaption funzioni membro.
const char * (Window::*pfnwGC)() = &Window::GetCaption;
bool (Window::*pfnwSC)( const char * ) = &Window::SetCaption;
i puntatori pfnwGC e pfnwSC posizionarvi GetCaption e SetCaption il Window classe, rispettivamente.Le informazioni delle copie di codice alla barra del titolo della finestra direttamente tramite il puntatore a 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';
La differenza tra . * e - >* gli operatori (gli operatori di puntatore a membro) è che . * l'operatore seleziona i membri forniti un oggetto o un riferimento a un oggetto, mentre - >* l'operatore seleziona i membri tramite un puntatore.(Per ulteriori informazioni su questi operatori, vedere Espressioni con gli operatori Puntatore a Membro).
Il risultato dell'operatore puntatore a membro è il tipo del membro (in questo caso, char *.
Nel frammento di codice richiama le funzioni membro GetCaption e SetCaption utilizzo dei puntatori ai membri:
// 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 );