Freigeben über


Zeiger auf Member

Deklarationen von Zeigern auf Member sind besondere Fälle aus den Zeiger Deklarationen.Sie können mithilfe der folgenden Reihenfolge deklariert:

[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
  1. Der Parameterbezeichner Deklarationen:

    • Ein optionaler Speicherklassen Parameterbezeichner.

    • Optionales const und/oder volatile Bezeichner.

    • Der Typspezifizierer: der Name eines Typs.Dies ist der Typ des Members zu angezeigt werden sollen, nicht die Klasse.

  2. Der Deklarator:

    • Ein optionaler Microsoft-spezifische modifizierer.Weitere Informationen finden Sie unter Microsoft-spezifische Modifizierer.

    • Der qualifizierte Name der Klasse, die die Member angezeigt werden soll.Weitere Informationen finden Sie unter Namen und qualifizierte Namen.

    • ::Operator.

    • Der *-Operator.

    • Optionales const und/oder volatile Bezeichner.

    • Der Bezeichner, der den Memberzeiger benannt werden.

    • Ein optionaler Initialisierer:

Der =-Operator.

Der &-Operator.

Der qualifizierte Name der Klasse.

Der ::-Operator.

Der Name eines nicht statischen Member der Klasse des entsprechenden Typs.

Als immer, werden mehrere Deklaratoren (und alle zugeordneten Initialisierer) in einer einzelnen Deklaration ermöglicht.

Ein Zeiger auf einen Member einer Klasse unterscheidet sich von einem normalen Zeiger, da er Typinformationen für den Typ des Members und für die Klasse hat, zu der der Member gehört.Ein voller Zeiger bezeichnet (besitzt die Adresse eines), wird nur ein einzelnes Objekt im Arbeitsspeicher.Ein Zeiger auf einen Member einer Klasse bezeichnet diesen Member in jeder Instanz der Klasse.Das folgende Beispiel deklariert eine Klasse, Windowund mehrere Zeiger auf Member von Daten.

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

Im vorherigen Beispiel ist pwCaption ein Zeiger auf jeden Member der Klasse, die Window**char***Typ verfügt.Der Typ der pwCaption ist char * Window::*.Das folgende Codefragment deklariert Zeiger auf den SetCaption und GetCaption-Memberfunktionen.

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

Die Zeiger pfnwGC und pfnwSC zeigen Sie auf GetCaption und SetCaption der Window-Klasse.Die Code Kopien der Fensterbeschriftung Informationen direkt mit dem Zeiger auf den Member 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';

Der Unterschied zwischen.*und den – >*-Operatoren (die Zeiger-zu Member Operatoren) besteht darin, dass der Operator.*-die angegebenen Member auf ein Objekt oder ein Objektverweis auswählt, während der – >*-Operator Member über einen Zeiger auswählt.(Weitere Informationen zu diesen Operatoren finden Sie unter Ausdrücke mit Zeiger-zu-Member Operatoren).

Das Ergebnis der Zeiger-zu Member Operatoren ist der Typ des Members (in diesem Fall char *.

Das folgende Codefragment ruft die Memberfunktionen GetCaption und mithilfe der SetCaption Zeiger auf Member aufgeführt:

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

Siehe auch

Referenz

C++-abstrakte Deklaratoren