Udostępnij za pośrednictwem


Wskaźniki do elementów członkowskich

Deklaracje wskaźników do elementów członkowskich, są specjalnymi przypadkami zgłoszeń wskaźnika. Są deklarowane za pomocą następującej sekwencji:

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

    • Opcjonalna specyfikator urządzenia klasy magazynowania.

    • Opcjonalny const i/lub specyfikatory volatile.

    • Specyfikator typu: nazwa typu. Jest to typ elementu członkowskiego, nie wskazujący na klasę.

  2. Specyfikator:

    • Opcjonalny modyfikator właściwy dla Microsoft.Aby uzyskać więcej informacji, zobacz Modyfikatory specyficzne dla firmy Microsoft.

    • Kwalifikowana nazwa klasy, zawierająca elementy członkowskie do wskaźników. Zobacz Nazwy i nazwy kwalifikowane.

    • Operator ::.

    • Operator *.

    • Opcjonalny const i/lub specyfikatory volatile.

    • Identyfikator nazewnictwa wskaźnika do elementu członkowskiego.

    • Opcjonalny inicjator:

Operator =.

Operator &.

Kwalifikowana nazwa klasy.

Operator ::.

Nazwa niestatycznego członka klasy odpowiedniego typu.

Jak zawsze, wiele deklaratorów (i wszelkie skojarzone inicjatory) są dozwolone w jednej deklaracji.

Wskaźnik jest członkiem klasy różniącym się od normalnego wskaźnika, ponieważ zawiera informacje o typie dla typu elementu członkowskiego i klasy, do której należy dany element członkowski.Normalny wskaźnik Identyfikuje (ma adres) pojedynczy obiekt w pamięci.Wskaźnik jest członkiem klasy identyfikującym ten element członkowski w dowolnym wystąpieniu klasy.W poniższym przykładzie deklaruje klasę Window i niektóre wskaźniki do danych elementu członkowskiego.

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

W poprzednim przykładzie pwCaption jest wskaźnikiem do dowolnego elementu członkowskiego klasy Window, który ma typ char *.Typ pwCaption jest char * Window::*.Następny fragment kodu deklaruje wskaźniki do elementów członkowskich funkcji SetCaption i GetCaption.

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

Wskaźniki pfnwGC i pfnwSC wskazują odpowiednio klasy GetCaption i SetCaption z Window.Kod kopiuje informacje do nagłówka klasy window bezpośrednio, za pomocą wskaźnika do elementu członkowskiego 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';

Różnica między operatorami .* i –>* (operator wskaźnika do elementu członkowskiego) jest taka, że operator . * wybiera elementy członkowskie biorąc pod uwagę obiekt lub odwołanie do obiektu, podczas gdy operator –>* wybiera elementy członkowskie za pomocą wskaźnika. (Aby uzyskać więcej informacji o tych operatorach, zobacz Wyrażenia z operatorami wskaźnik-do-składowej.)

Wynik operatora wskaźnika do elementu członkowskiego jest typem elementu członkowskiego — w tym przypadku, char *.

Poniższy fragment kodu wywołuje funkcje składowe GetCaption i SetCaption za pomocą wskaźników do elementów członkowskich:

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

Zobacz też

Informacje

Deklaratory abstrakcyjne języka C++