-
[C++] 함수 포인터C++ 2019. 8. 27. 09:01
함수 포인터
함수도 변수와 마찬가지로 메모리 어딘가에 저장되어 주소를 가지고 있고, 이 주소를 담기 위한 포인터 변수를 선언할 수 있다.
12345678910111213141516171819202122232425262728293031#include <iostream>using namespace std;int func(){return 5;}int goo(){return 10;}int main(){int(*fcnptr)() = func; // 함수 포인터의 선언(함수의 이름은 함수가 저장된 주소를 나타낸다)cout << fcnptr() << endl;fcnptr = goo; // 다른 함수로 교체cout << fcnptr() << endl;return 0;}cs 함수 포인터의 타입(반환형, 매개변수)은 가리킬 함수의 타입과 일치하여야 한다. 타입이 다르면 에러가 발생한다.
함수를 다른 함수로 전달
또한 다른 포인터와 마찬가지로 함수의 주소도 매개변수로 받을 수 있다.
즉 함수도 변수처럼 다른 함수로 넘길 수 있다.
12345678910111213141516171819202122232425262728293031323334353637#include <iostream>#include <array>using namespace std;bool isEven(const int &number){if (number % 2 == 0)return true;elsereturn false;}bool isOdd(const int &number){if (number % 2 == 1)return true;elsereturn false;}void printNumbers(const array<int, 10> &my_array, bool (*check_fcn)(const int&))// 함수의 주소를 함수 포인터로 선언된 매개변수로 받는다{for (auto elem : my_array)if (check_fcn(elem) == true) cout << elem << " ";cout << endl;}int main(){array<int, 10> my_array{ 0,1,2,3,4,5,6,7,8,9};printNumbers(my_array, isEven); // 함수의 주소(함수의 이름)을 넘긴다printNumbers(my_array, isOdd);return 0;}cs 함수 포인터를 축약해서 사용하기
길고 복잡해 보이는 함수 포인터의 타입을 typedef나 using을 통해 변수의 이름처럼 보이도록 축약해서 사용할 수 있다.
예) typedef
123456789typedef bool(*check_fcn_t)(const int&);void printNumbers(const array<int, 10> &my_array, check_fcn_t check_fcn){for (auto elem : my_array)if (check_fcn(elem) == true) cout << elem << " ";cout << endl;}cs 예) using
12345678using check_fcn_t = bool(*)(const int&);void printNumbers(const array<int, 10> &my_array, check_fcn_t check_fcn){for (auto elem : my_array)if (check_fcn(elem) == true) cout << elem << " ";cout << endl;}cs C++ 11의 function
함수 포인터를 사용할 때 bool (*check_fcn)(const int&)과 같은 알아보기 어려운 코드 대신에 functional 라이브러리에 있는 function이라는 클래스를 사용해서 함수 포인터를 선언하면 훨씬 직관적이고 명시적으로 나타낼 수 있다.
12345678910111213141516171819202122232425262728293031323334353637383940414243#include <iostream>#include <array>#include <functional> // function의 사용using namespace std;bool isEven(const int &number){if (number % 2 == 0)return true;elsereturn false;}bool isOdd(const int &number){if (number % 2 == 1)return true;elsereturn false;}void printNumbers(const array<int, 10> &my_array, function<bool(const int&)> check_fcn){for (auto elem : my_array)if (check_fcn(elem) == true) cout << elem << " ";cout << endl;}int main(){array<int, 10> my_array{ 0,1,2,3,4,5,6,7,8,9};function<bool(const int&)> fcnptr = isEven; // function 클래스로 함수 포인터 선언printNumbers(my_array, fcnptr);fcnptr = isOdd;printNumbers(my_array, fcnptr);return 0;}cs 참고 자료
https://www.inflearn.com/course/following-c-plus/lecture/14724 (인프런, 홍정모의 따라배우는 C++(7.9 함수 포인터))
'C++' 카테고리의 다른 글
[C++] 증감 연산자 오버로딩(전위 연산자, 후위 연산자) (0) 2019.09.04 [C++] this 포인터 (0) 2019.08.29 [C++] Tuple (복수의 값 반환) (1) 2019.08.22 [C++] const 위치에 따른 포인터의 의미 (0) 2019.07.18 [C++] 참조 변수(Reference variable) (0) 2019.07.18