C++ Chapter 7.7 : 함수 포인터
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 7. 함수 : 함수 포인터
배열의 이름이 배열의 주소 값을 가지듯, 함수의 이름도 함수의 주소를 가진다.
함수 포인터 정의 방법
int func(int x)
{
return x;
}
int main()
{
cout << func << endl; // 01201084 출력 (함수의 주소)
int (*funcptr)(int) = func; // 함수 포인터 funcptr 선언 및 초기화
cout << funcptr << endl; // 01201084 출력
}
int
: 주소에 있는 함수의 리턴 타입(*funcptr)
: 함수 포인터 이름funcptr
(int)
: 주소에 있는 함수의 매개변수 타입 적어주는 부분. 없으면 그냥()
= func
: func 함수의 주소로 초기화 함. 함수의 이름은 그 함수의 주소 !
함수 포인터 사용 방법
int func(int x)
{
return x;
}
int main()
{
cout << func << endl;
int (*funcptr)(int) = func;
cout << funcptr << endl;
cout << funcptr(5) << endl; // 5출력. func 함수의 주소를 가지고 있는 포인터 funcptr로 fun 함수를 사용할 수 있게 되었음
}
함수 포인터 이름(파라미터)
- 이렇게 주소를 담고 있는 함수의 기능을 사용할 수 있다.
- 포인터 funcptr 이 함수 func의 주소를 가지고 있기 때문에
func(3)
은funcptr(3)
이렇게도 호출할 수 있다.
funcptr = func2
- 이렇게 함수 포인터에 다른 함수를 대입을 하려면 리턴타입, 매개변수타입, 매개변수의 개수가 서로 일치해야 가능하다.
- funcptr은
int (*funcptr)(int)
타입이므로 func2 함수 또한 리턴타입이 int고 매개변수 타입도 int고 매개변수도 1개여야 funcptr에 주소 대입이 가능하다.
- funcptr은
- 이렇게 함수 포인터에 다른 함수를 대입을 하려면 리턴타입, 매개변수타입, 매개변수의 개수가 서로 일치해야 가능하다.
함수 포인터를 파라미터로 넘기기
void printNumbers(const array<int, 10> &my_array, bool print_even)
{
for (auto element : my_array)
{
if (print_even && element % 2 == 0) cout << element;
if (!print_even && element % 2 == 1) cout << element;
}
cout << endl;
}
int main()
{
std::array<int, 10> my_array{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
printNumbers(my_array, true); // 짝수인 원소만 출력
printNumbers(my_array, false); // 홀수인 원소만 출력
}
짝수이면 ture 리턴 함수, 홀수이면 ture 리턴 함수 이렇게 만들어서 함수 자체를 파라미터로 넘겨 어떤 함수인지에 따라 다르게 계산하면 어떨까
bool isEven(const int & number)
{
if (number % 2 == 0) return true;
}
bool isOdd(const int & number)
{
if (number % 2 == 1) return true;
}
void printNumbers(const array<int, 10> &my_array, bool(*check_fcn)(const int &))
{
for (auto element : my_array)
{
if (check_fcn(element) == true) cout << element;
}
cout << endl;
}
int main()
{
std::array<int, 10> my_array{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
printNumbers(my_array, isEven); // 짝수인 원소만 출력
printNumbers(my_array, isOdd); // 홀수인 원소만 출력
}
- print_even 자리는 함수 이름을 받는 check_fcn로 대체 됐다.
- 즉, 어떤 기능을 할지 넘겨 주는 것.
- 함수 이름을 파라미터로 넘겨 기능을 명시
check_fcn
는 함수 포인터이기 때문에함수 이름
을 넘겨 받아야 한다.isEven
함수 이름을 넘기면isEven(element)
되는거나 마찬가지.isOdd
함수 이름을 넘기면isOdd(element)
되는거나 마찬가지.
bool(*check_fcn)(const int &) = isEven
매개변수를 위와 같이 디폴트 값을 isEven으로 설정해주면 printNumbers(my_array)
이렇게만 호출하면 짝수인 원소만 출력된다.
함수 포인터 타입 줄여 쓰기
1. using
using check_fcn_t = bool(*)(const int &);
check_fcn_t funcptr = isEven; // bool(*funcptr)(const int &) = isEven 과 같다.
bool(*)(const int &)
라는 데이터 타입을check_fcn_t
로 줄여 쓸 수 있게 되었다.
2. typedef
typedef bool(*check_func_t)(const int &);
check_fcn_t funcptr = isEven; // bool(*funcptr)(const int &) = isEven 과 같다.
bool(*)(const int &)
라는 데이터 타입을check_fcn_t
로 줄여 쓸 수 있게 되었다.
std::function
- #include <functional>
- C++11에 처음 소개된 Function 기능을 함수 포인터보다도 더 많이 쓴다.
std::function<bool>(const int &) funcptr = isEven; // funcptr : bool 타입을 리턴하고 const int & 타입의 매개변수를 필요로 하는 함수의 주소를 담을 수 있는 변수
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기