[STL] 함수포인터 - 멤버 함수 호출

멤버 함수 호출
멤버 함수 호출은 포인터 선언에 어떤 클래스의 멤버 함수를 가리킬건지 클래스이름을 지정해줘야 합니다.

Ex) 시그니처가 void Point::Print(int n)인 멤버 함수 포인터 선언
void(Point::*pf)(int) 로 pf 멤버 포인터 선언

- * 객체로 멤버 함수 호출 시에는 .* 연산자를 이용한다. 예를 들어 (객체.*pf)(10) 처럼 사용
- * 주소로 멤버 함수 호출 시에는 -> * 연산자를 이용한다. 예를 들어 (주소->*pf)(10) 처럼 사용

 

코드
#include <iostream>
using namespace std;

class Point {
	int x;
	int y;
public:
	explicit Point(int _x = 0, int _y = 0) : x(_x), y(_y) {}
	void Print() const { cout << x << ',' << y << endl; }
	void PrintInt(int n) { cout << "테스트 정수: " << n << endl; }
};

int main() {

	Point pt(2, 3);
	Point* p = &pt;

	void (Point:: * pf1)() const; //멤버 함수 포인터 선언
	//void- > 반환 타입이 X
	//Point:: *pf1 -> pf1은 Point클래스 내의 멤버함수 포인터(멤버 함수의 주소를 가리키는 변수)
	//() - > 매개변수를 받지 않음.
	pf1 = &Point::Print;

	void (Point:: * pf2)(int); //멤버 함수 포인터 선언
	//void- > 반환 타입이 X
	//Point:: *pf1 -> pf1은 Point클래스 내의 멤버함수 포인터(멤버 함수의 주소를 가리키는 변수)
	//(int) - > int형 매개변수를 받음.
	pf2 = &Point::PrintInt;

	pt.Print(); //단순 객체 멤버함수 호출
	pt.PrintInt(10); //pt의 객체 멤버함수 호출
	cout << endl;

	(pt.*pf1)(); //객체로 멤버 함수 포인터를 이용한 호출
	(pt.*pf2)(10); //객체로 멤버 함수 포인터를 이용한 호출
	cout << endl;

	(p->*pf1)(); //주소로 멤버 함수 포인터를 이용한 호출
	(p->*pf2)(10); //주소로 멤버 함수 포인터를 이용한 호출

	return 0;
}

 

pt: Point 클래스

*p: pt의 주소를 갖는 포인터 변수

pf1: Point 클래스의 Print함수 사용을 위해 반환이 void이고 Point형으로 명시한, 매개변수가 없는 함수 포인터

pf2: Point클래스의 PrintInt함수 사용을 위해 반환이 void이지만 매개변수를 Int로 받는 함수 포인터

 

객체로 멤버 함수를 호출하기 위해

1. .*를 활용한 (pt.*pf1)()로 Print 함수호출

2. .*를 활용한 (pt.*pf2)(10)로 Int형을 매개변수로 받는 PrintInt 함수 호출

 

주소로 멤버 함수 호출하기 위해

1. ->*를 활용한 (p->pf1)() 로 Print 함수 호출

2. ->*를 활용한 (p->pf2)(int)로 PrintInt 함수 호출

 

결과

'C++ > STL' 카테고리의 다른 글

[STL] 함수 객체  (0) 2025.02.20
[STL] 함수 포인터 - 콜백 함수  (0) 2025.02.15
[STL]함수 포인터 - 정적 함수 호출  (0) 2025.02.15
[STL] 함수 포인터의 종류  (0) 2025.02.15
[STL] 함수 포인터 선언과 사용  (0) 2025.02.15