typedef를 통해 타입을 재정의 했던 것처럼 함수도 타입을 재정의 할 수 있다.
// 반환값(이름)(매개변수)
typedef int(FUNC_TYPE)(int, int);
함수의 이름은 함수의 시작 주소를 들고있는것과 같다. (마치 배열과 유사함)
FUNC_TYPE* fn;
fn = Add;
int result = fn(1, 2);
int result2 = (*fn)(1, 2); // 둘다 완벽하게 동일하게 동작
재정의가 된 함수는 기존의 포인터 변수처럼 사용할 수 있다.
함수 포인터는 *(접근 연산자)이 붙어도 함수 주소에 접근한다.
함수 포인터는 함수의 인자로 건네줄 수도 있다. 동작 자체를 넘겨주는 것과 같다.
인자로 넘겨주는 경우 따로 재정의를 하지 않고 매개변수에서 바로 선언할 수 있다.
Item* FindItem(Item* items, bool(*selector)(Item* item)) // FUNC_TYPE* selector
{
// ..
}
재정의를 했는데 포인터를 붙이지 않고 사용하는 것은 전방선언만 해놓은 것을 사용하겠다고 하는것과 같기 때문에 컴파일 오류가 발생한다. 실제로 메모리에도 잡히지 않는다.
보통은 포인터까지 붙여서 한번에 재정의를 하는 편이다.
typedef int(*PFUNC)(int, int);
다만 여태까지의 문법으로는 전역 함수와 정적 함수만 담을 수 있다. (호출 규약이 동일한 것들)
멤버 함수는 자기 자신의 객체를 넘겨주는것부터 시작하기 때문에 호출 규약이 맞지 않다.
typedef int(Knight::*PMEMFUNC)(int, int);
멤버 함수 포인터는 이렇게 선언할 수 있다.
사용은 조금 복잡한 편이다.
Knight k1;
PMENFUNC mfn;
mfn = &Knight::GetHP; // 반드시 &를 붙여주어야 한다
(k1.*mfn)(1, 2); // 반드시 *을 붙여주어야 한다
'C++ > Rookiss C++' 카테고리의 다른 글
[콜백 함수] 템플릿 기초 (0) | 2022.08.30 |
---|---|
[콜백 함수] 함수 객체 (0) | 2022.08.30 |
[디버깅] (0) | 2022.08.30 |
전방선언 (0) | 2022.08.29 |
[동적 할당] 캐스팅 4총사 (0) | 2022.08.29 |