C++/C++

[C++] 함수포인터, 멤버 함수 포인터

sihyeong 2022. 11. 27. 23:35

함수포인터

  • 함수도 변수처럼 주소를 포인터 변수에 저장하여 접근이 가능하다.
  • 포인터 변수에 함수의 주소를 저장하여 참조하기 위해 사용한다.
int (*varName) (int, int);

typedef int (*funcVarName) (int, int);
funcVarName a;
  • int - 함수의 리턴타입
  • (*varName) - 함수의 주소를 저장할 포인터 변수의 이름    /    (int* a)에서 a와 같은 역할
  • (int, int) - 함수의 매개변수
  • int func(int, int) 형식의 함수의 주소를 저장할 수 있는 varName 포인터변수 생성
  • typedef로 해당 형식을 미리 지정해 놓고 (int a) 하는 것 처럼 (funcName a)로 바로 접근도 가능하다.
int add(int a, int b)
{
   return (a + b);
}

int main(void)
{
   int (*varName)(int, int);

   varName = add;		        // add함수의 주소를 varName 변수에 저장

   cout << varName(1, 2) << endl;	// varName에 저장된 함수 호출  - 출력 : 3
}
  • 포인터변수에 함수의 주소를 저장한 다음
  • 함수를 호출하는 것 처럼 매개변수를 주고 호출하면 된다.

 

멤버 함수 포인터

class CPlayer
{
    void Outout() {};
}

typedef void(CPlayer::*pFunc)(void);
pFunc = &CPlayer::Output;

CPlayer Player1;
(Player1.*pFunc)();
  • void(CPlayer::*pFunc)(void) 
  • void - 멤버 함수 포인터 리턴 타입
  • CPlayer:: - 어떠한 클래스의 멤버 함수를 호출할 것인지 알려주기 위함이다.
  • *pFunc - 는 멤버 함수 포인터 이름
  • (void) - 멤버 함수 포인터 매개변수 타입
  • pFunc는 CPlayer의 멤버 함수만 호출이 가능하다.
  • 클래스의 멤버 함수를 호출하기 위해선 클래스 객체가 필요하다.
  • CPlayer a;  a.Outout() 처럼, Outout이 전역함수가 아니기 때문에 객체가 꼭 필요하다.
  • player1.Output() != player1.&Output()  따라서 pFunc는 함수의 주소를 저장하고 있기 때문에 player1.*Outout()처럼 호출한다.