멤버에 대 한 포인터
멤버에 대 한 포인터의 선언 포인터 선언 중 특수 한 경우입니다.다음 시퀀스를 사용 하 여 선언 된:
[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
선언 지정자:
선택적 저장소 클래스 지정 자가 있습니다.
선택적인 const 또는 volatile 지정자입니다.
형식 지정자: 형식의 이름입니다.이를 가리키는 것으로 멤버의 형식입니다. 클래스가 없습니다.
선언 자:
선택적 Microsoft 특정 한정자입니다.자세한 내용은 Microsoft 전용 한정자.
가리키는으로 멤버를 포함 하는 클래스의 정규화 된 이름입니다.참조 하십시오 이름과 정규화 된 이름은.
:: 연산자입니다.
* 연산자입니다.
선택적인 const 또는 volatile 지정자입니다.
포인터 멤버 이름을 지정 하는 식별자입니다.
선택적 이니셜라이저:
= 연산자입니다.
해당 및 연산자입니다.
클래스의 정규화 된 이름입니다.
:: 연산자입니다.
적합 한 형식의 클래스의 비정적 멤버의 이름입니다.
항상 선언 자를 여러 개 (및 모든 연결 된 이니셜라이저) 단일 선언에서 허용 됩니다.
멤버가 속한 클래스 및 멤버의 형식에 대 한 형식 정보가 있기 때문에 일반적인 포인터에서 클래스의 멤버에 대 한 포인터와는 다릅니다.일반 포인터로 식별 (주소 있습니다) 메모리에 개체를 하나만 있습니다.클래스의 멤버에 대 한 포인터 멤버에는 클래스의 인스턴스를 식별합니다.다음 예제에서는 클래스 선언 Window, 및 일부 데이터 구성원에 대 한 포인터입니다.
// 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()
{
}
앞의 예제에서 pwCaption 클래스의 모든 멤버에 대 한 포인터는 Window 형식을 가진 char *.The type of pwCaption is char * Window::*.다음 코드 조각에 대 한 포인터를 선언에서 SetCaption 및 GetCaption 멤버 함수입니다.
const char * (Window::*pfnwGC)() = &Window::GetCaption;
bool (Window::*pfnwSC)( const char * ) = &Window::SetCaption;
포인터 pfnwGC 및 pfnwSC 가리킵니다 GetCaption 및 SetCaption 에 Window 클래스를 각각.코드 멤버에 대 한 포인터를 사용 하 여 직접 창 캡션에 정보 복사 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';
차이 . * 및 – > * 연산자 (포인터 멤버 연산자) 되는 . * 연산자는 구성원 선택 개체 또는 개체 참조를 지정 하는 동안의 – > * 연산자는 포인터를 통해 멤버를 선택 합니다.(이러한 연산자에 대 한 자세한 내용은 참조 하십시오. 포인터 멤버 연산자를 사용 하 여 식을입니다.)
멤버의 형식 포인터 멤버 연산자의 결과입니다-이 경우 char *.
다음 코드 단편은 멤버 함수를 호출 합니다. GetCaption 및 SetCaption 멤버에 대 한 포인터를 사용 하 여:
// 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 );