C++에서는 클래스의 멤버들을 지시하는 포인터를 정의할 수 있다. 간단한 예제를 보자.
class Example
{
public:
int feet;
int inches;
public:
Example();
Example(int ft);
~Example();
void Show_in() const;
void Show_ft() const;
void Use_ptr() const;
}
여기서 Example안에 있는 멤버 변수를 대상으로 포인터를 만들어보자.
int Example::*pt = &Example::inches;
이렇게 하면 된다. 하지만 일반 포인터랑은 약간 다르다. 일반 포인터는, 변수의 주소를 가리켰다. 그러나 멤버 포인터는 그렇지 않다. 왜? 특정 객체를 지시하지 않기 때문이다. 대신, pt 포인터는 Example 안에 있는 inches 멤버의 위치를 인식한다. 따라서 객체를 이용해 어떤 객체 안에 있는 inches를 가리키는지 정해줘야 한다.
Example ob1;
Example ob2;
Example* po = new Example;
cout << ob1.*pt << endl; // ob1의 inches 멤버를 출력한다.
cout << ob2.*pt << endl; // ob1의 inches 멤버를 출력한다.
cout << po->*pt << endl; // *po의 inches 멤버를 출력한다.
여기서 .*와 ->*는 멤버 내용 참조 연산자다. 객체와 함께 사용하면, 멤버에 제대로 접근할 수 있다. 객체뿐만 아니라 포인터 자체도 바꿀 수 있다.
pt = &Example::feet; // pt가 feet를 지시한다.
cout << ob1.*pt << endl; // ob1의 feet를 출력한다.
또한 멤버 함수들을 식별하기 위해 멤버 포인터를 사용할 수도 있다. 매개변수를 하나도 사용하지 않는 보통의 void형 함수를 지시하는 포인터는 다음과 같았다.
void(*pf)();
멤버 함수를 지시하는 포인터는, 멤버 변수와 마찬가지로 어떤 클래스인지를 알려주면 된다.
void (Example::*pf)() const; // pf는 Example 클래스의 멤버 함수를 지시한다.
이제 특정 멤버 함수를 대입하면 된다.
pf = &Example::Show_inches;
일반적인 함수 포인터와는 다르게 &를 써주어야 한다. 이제 함수를 호출할 수 있다.
Example(30);
(ob3.*pf)();