Sdílet prostřednictvím


Ukazatelé na členy

Deklarace ukazatelů na členy jsou speciálními případy deklarace ukazatele. Jsou deklarovány následujícím způsobem:

[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier] 
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
  1. Specifikátor deklarace:

    • Volitelný specifikátor paměťové třídy.

    • Volitelné specifikátory const nebo volatile.

    • Typ specifikátoru: název typu. Jedná se o typ člena, na kterého je odkazováno, nikoli třídu.

  2. Deklarátor:

    • Volitelný specifický modifikátor Microsoft.Další informace naleznete v tématu Modifikátory společnosti Microsoft.

    • Kvalifikovaný název třídy, která obsahuje členy, na které bude odkazováno. Další informace naleznete v tématu Názvy a kvalifikované názvy.

    • Operátor ::.

    • Operátor *.

    • Volitelné specifikátory const nebo volatile.

    • Identifikátor určující název ukazatele na člen.

    • Volitelný inicializátor:

Operátor =.

Operátor &.

Kvalifikovaný název třídy.

Operátor ::.

Název třídy nestatického člena třídy příslušného typu.

Jako vždy je v jedné deklaraci povoleno více deklarátorů (a všech přidružených inicializátorů).

Ukazatel na člen třídy se liší od normálního ukazatele, protože obsahuje informace o typu pro typ člena a třídy, do které člen náleží.Normální ukazatel identifikuje (má adresu) pouze jeden objekt v paměti.Ukazatel na člen třídy identifikuje tohoto člena v libovolné instanci třídy.Následující příklad deklaruje třídu, Window a některé ukazatele na data členů.

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

V předchozím příkladu je pwCaption ukazatel na libovolný člen třídy Window, který má typ char*.Typ pwCaption je char * Window::*.Následující fragment kódu deklaruje ukazatele na členské funkce SetCaption a GetCaption.

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

Odkazy pfnwGC a pfnwSC odkazují na GetCaption a SetCaption z třídy Window.Kód zkopíruje údaje přímo do titulku okna pomocí ukazatele na člen 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';

Rozdíl mezi operátory .* a –>* (operátory člen ukazatele na člen) je, že operátor .* vybere členy zadané objektu nebo odkaz na objekt, zatímco operátor –>* vybere členy prostřednictvím ukazatele. (Další informace o těchto operátorech naleznete v tématu Výrazů s operátory ukazatele na člen.)

Výsledek operátoru ukazatele na člen je typ člena - v tomto případě char*.

Následující fragment kódu vyvolá členské funkce GetCaption a SetCaption použitím ukazatele na členy:

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

Viz také

Referenční dokumentace

Deklarátory abstraktu jazyka C++