함수 역시 메모리의 시작 주소값을 가진다. 그래서 변수처럼 함수의 주소값을 가지는 포인터를 가질 수 있는데 이를 함수포인터 라고한다.
int Function(int a)
{
printf("%d", a);
return a;
}
int main()
{
//함수 포인터 생성
int(*Fp)(int);
//포인터에 함수 대입
Fp = Function;
//함수 호출
Fp(10);
(*Fp)(10);
}
위의 코드와 다르게 함수가 어떤 클래스의 멤버함수인 경우엔 void (FClass::*Fp)(int)처럼 선언한다.
함수포인터를 이용한 콜백 메커니즘
대표적인 콜백함수를 구현하는 방식으로 함수포인터를 넘겨주는 방법이 있다.
//클라1
void Print1(int n)
{
cout << n << endl;
}
//클라2
void Print2(int n)
{
cout << n * n << endl;
}
//클라3
void Print3(int n)
{
cout << "정수 : "<<n << endl;
}
//서버
void For_each(int *begin, int *end, void (*pf)(int))
{
while (begin!=end)
{
pf(*begin++);
}
}
int main()
{
int arr[5] = { 1,2,3,4,5 };
For_each(arr, arr + 5, Print1);
cout << endl;
For_each(arr, arr + 5, Print2);
cout << endl;
For_each(arr, arr + 5, Print3);
}
서버는 클라이언트의 함수를 모르더라도 클라이언트의 함수포인터를 넘김으로써 서버가 클라이언트를 호출하는것을 콜백이라고 한다.
'언어 > C++' 카테고리의 다른 글
(C++) 템플릿 (0) | 2020.09.14 |
---|---|
(C++)함수 호출 규약 (0) | 2020.07.13 |
(C++)타입변환 연산자 오버로딩 (0) | 2020.07.02 |
(C++)연산자 오버로딩의 활용 (0) | 2020.06.29 |
(C++)VS에서 함수에서 지역변수의 레퍼런스값 리턴시 접근할수 있는 이유 (0) | 2020.06.29 |