Pointeurs vers des membres
Les déclarations des pointeurs vers des membres sont des cas spéciaux de déclarations de pointeur.Ils sont déclarés à l'aide de la séquence suivante :
[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
le spécificateur de déclaration :
un spécificateur facultatif de classe de stockage.
const facultatif et/ou spécificateurs d' volatile .
le spécificateur de type : le nom d'un type.Il s'agit du type du membre à pointer vers, pas la classe.
le déclarateur :
Un modificateur facultatif spécifique de Microsoft.Pour plus d'informations, consultez Modificateurs spécifiques.
Le nom qualifié de la classe contenant les membres à pointer vers.Consultez noms et noms qualifiés.
: : opérateur.
l'opérateur de * .
const facultatif et/ou spécificateurs d' volatile .
L'identificateur nommez le pointeur vers membre.
un initialiseur facultatif :
l'opérateur de = .
& l'opérateur.
le nom qualifié de la classe.
Opérateur ::.
Le nom d'un membre non statique de la classe du type approprié.
Comme toujours, il permet à plusieurs déclarateurs (ainsi que les initialiseurs associés) dans une déclaration unique.
Un pointeur vers un membre d'une classe diffère d'un pointeur normal car il a des informations de type pour le type de membre et de la classe à laquelle le membre appartient.Un pointeur normal identifie (a l'adresse de) uniquement un seul objet en mémoire.Un pointeur vers un membre d'une classe identifie ce membre dans une instance de la classe.L'exemple suivant déclare une classe, Window, et des pointeurs vers des membres de données.
// 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()
{
}
Dans l'exemple précédent, pwCaption est un pointeur vers un membre de la classe Window qui a le type char*.le type d' pwCaption est char * Window::*.Le fragment de code suivant déclare les pointeurs vers des fonctions membres d' SetCaption et d' GetCaption .
const char * (Window::*pfnwGC)() = &Window::GetCaption;
bool (Window::*pfnwSC)( const char * ) = &Window::SetCaption;
les pointeurs pfnwGC et point d' pfnwSC à GetCaption et à SetCaption de la classe d' Window , respectivement.Les informations de copies de code à titre de la fenêtre directement à l'aide de le pointeur vers membre 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 différence entre.*et les opérateurs de - >* (les opérateurs de pointeur) est que l'opérateur de.*sélectionne des membres dotés d'un objet ou une référence d'objet, tandis que l'opérateur de - >* sélectionne des membres via un pointeur.(Pour plus d'informations sur ces opérateurs, consultez l' Expressions avec des opérateurs de pointeur vers membre.)
Le résultat des opérateurs de pointeur est le type du membre - dans ce cas, char *.
Le fragment de code suivant appelle les fonctions membres GetCaption et SetCaption à l'aide de les pointeurs vers des membres :
// 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 );