Wskaźniki do członków
Deklaracje wskaźniki do członków są przypadkami specjalnymi wskaźnik deklaracji.Są one zgłoszone, za pomocą następującej sekwencji:
[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
Specyfikator deklaracji:
Specyfikator klasy magazynowania opcjonalne.
Opcjonalny const i/lub volatile Specyfikatory.
Specyfikator typu: nazwy typu.Jest to typ członka, który ma być wskazywanego nie klasy.
Niewłaściwy deklarator:
Opcjonalne Microsoft szczególnych modyfikatora.Aby uzyskać więcej informacji, zobacz Modyfikatorów specyficzne dla firmy Microsoft.
Kwalifikowanej nazwy klasy, zawierający elementy, aby wskazać, do.Zobacz nazwy i nazwy kwalifikowanej.
:: Podmiot gospodarczy.
* Operatora.
Opcjonalny const i/lub volatile Specyfikatory.
Identyfikator nazewnictwa wskaźnik do elementu członkowskiego.
Inicjator opcjonalne:
= Operatora.
& operatora.
Kwalifikowanej nazwy klasy.
:: Operatora.
Nazwa do niestatycznego członka klasy odpowiedniego typu.
Jak zawsze wielu declarators (i wszystkie skojarzone inicjatory) są dozwolone w jednej deklaracji.
Wskaźnik do członka klasy różni się od normalny wskaźnik, ponieważ ma informacji typu dla typu członka i klasy, do której należy dany członek.Identyfikuje normalny wskaźnik (ma adres) pojedynczy obiekt w pamięci.Wskaźnik do członka klasy identyfikuje tego członka w dowolnej instancji klasy.Poniższy przykład deklaruje klasy, Windowi niektóre wskaźniki do danych.
// 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źnik do każdego członka klasy Window typ jest char *.The type of pwCaption is char * Window::*.Następny fragment kodu deklaruje wskaźniki do SetCaption i GetCaption funkcji elementów członkowskich.
const char * (Window::*pfnwGC)() = &Window::GetCaption;
bool (Window::*pfnwSC)( const char * ) = &Window::SetCaption;
Kursory pfnwGC i pfnwSC wskaż GetCaption i SetCaption z Window lub odpowiednio class.Kod kopiuje informacje do tytuł okna bezpośrednio za pomocą wskaźnika do członka 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 . * i – > * jest to, że podmioty gospodarcze (Operatorzy wskaźnik członek) . * operator wybiera członków podany obiekt lub odwołanie do obiektu, podczas gdy – > * operator wybiera członków za pomocą wskaźnika.(Aby uzyskać więcej informacji na temat tych operatorów, zobacz wyrażeń z operatorami wskaźnik do Państwa.)
Wynik operatorów wskaźnik członek jest typ 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 członków:
// 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 );