함수포인터는 함수를 가리키는 포인터이다.
형식은 리턴타입 (*변수명)(인수의 목록);
int (*pf)(int);는 매개변수 int를 가지고 int를 반환하는 함수의 포인터이다.(매개변수 변수명은 생략가능)
함수포인터는 자신과 원형이 같은 함수의 시작번지를 가리킬 수 있다.
int func(int a)에 대하여 pf = func;로 대입할 수 있다.
괄호없이 단독으로 사용된 함수명은 함수의 시작 번지를 나타내는 포인터 상수이기 때문에 &을 사용할 필요가 없다.
(*pf)(2);
pf(2);
위는 함수포인터로 함수를 호출하는 방법인데 pf가 함수의 번지를 나타내므로 (*pf)는 함수 자체를 나타낸다.
pf(2)는 컴파일러가 지원하는 간략화된 호출 방법으로 함수포인터를 함수처럼 사용할 수 있다.
typedef int (*PFTYPE)(int);
PFTYPE pf;
함수포인터는 타입의 형식이 너무 길기 때문에 자주 사용한다면 typedef로 원하는 타입 이름으로 바꾸는것도 좋다.
함수포인터를 사용하는 경우는
① 선택해야 할 함수가 두 개 이상인 경우, 수십개의 함수중 하나를 선택할 때 함수포인터배열 사용.
② 함수를 선택하는 시점과 실제로 호출하는 시점이 다를 경우, 즉 func()를 쓰면 함수를 호출해버리므로 함수포인터로 호출할 함수를 미리 선택만 해 놓을 수 있다.
③호출할 함수가 DLL같은 외부 모듈에 있어 동적으로 연결할 경우
함수 포인터는 정적 함수, 전역 함수에만 사용할 수 있으며 클래스의 멤버 함수는 포인터로 사용할 수 없다.
typedef int(*PFUNC)(int,int) //전역
typedef int(KNIGHT::*PMEMFUNC)(int,int) //멤버
멤버함수를 포인터로 사용하려면 위와 같이 클래스를 명시해야 한다.
PMEMFUNC mfn;
mfn = &KNIGHT::GetHP();
(k1.*mfn)(1,1);
위는 멤버함수 포인터를 이용해 Knight의 멤버 함수를 실행하는 예시이다.
'C++' 카테고리의 다른 글
| [C++] 레퍼런스 (0) | 2022.01.03 |
|---|---|
| [C++] 가변 인수 함수 (0) | 2022.01.03 |
| [C++] Const 포인터 (0) | 2022.01.03 |
| [C++] 문자형 배열 vs 문자형 포인터 (0) | 2022.01.02 |
| [C++] 포인터 배열과 배열 포인터 (0) | 2022.01.02 |