프로그래밍/C++
[BasicGrammar] FunctionPointer(함수포인터) - with. c++
Changun An
2023. 4. 16. 20:00
반응형
함수의 주소는 함수에 해당하는 기계의 코드가 저장되어 있는 메모리 블록의 시작 주소.
주요 사용처
- 콜백함수 : 이벤트 핸들러, 인터럽트 핸들러, GUI 이벤트 처리를 위해 함수를 호출하기 위해서는 함수의 주소 값을 알아야하는데 이때 함수포인터를 사용하여 콜백 함수를 구성하게 된다. 이때 콜백함수의 매개변수, 반환 타입을 정의하여 사용한다.
- 함수포인터 배열 : 함수포인터를 배열로 선언하여 다양한 함수를 동적으로 저장하고 사용 가능하다.
- 동적로딩 : 라이브러리에서 함수 호출이 가능하며, 런타임 시 필요한 라이브러리를 로드하고 사용가능하다.
- 코드 재사용 : 다른 함수의 일부 기능을 함수포인터로 사용하여 재사용성을 높일 수 있다.
사용법 테스트)
#include <iostream>
int think() {
int num = 3;
std::cout << "think" << std::endl;
return 3;
};
double pam_origin(int num) {
return static_cast<double>(num);
};
int pam_a(int num) {
return num;
}
double pam_b(double num) {
return num;
}
double (*pf)(int num);
void estimate(int lines, double(*pf)(int)) {
std::cout << "estimate" << std::endl;
}
int main() {
std::cout << think << std::endl; // think의 주소값 전달
std::cout << think() << std::endl; // think의 리턴값 전달
pf = pam_origin;
// pf = pam_a; 반환형식이 달라서 안됨.
// pf = pam_b;매개변수 달라서 안됨.
estimate(50, pam_origin);
double x = pam_origin(4);
double y = (*pf)(5); //pam_origin 호출
double z = pf(5); //pam_origin 호출
return 0;
};
사용 예제)
#include<iostream>
double robot(int lns);
double changun(int lns);
void estimate_test(int lines, double(*pf)(int));
int main() {
int code = 0;
std::cout << "필요한 코드의 행 수를 입력하십시오 : ";
std::cin >> code;
std::cout << "robot의 시간 예상 : ";
estimate_test(code, robot);
std::cout << std::endl;
std::cout << "changun의 시간 예상 : ";
estimate_test(code, changun);
return 0;
}
double robot(int lns){
return 0.05 * lns;
}
double changun(int lns)
{
return 0.03*lns;
}
void estimate_test(int lines, double(*pf)(int)){
std::cout << lines << "행을 작성하는데 걸리는 시간은 : ";
std::cout << pf(lines) << " hour 걸립니다." << std::endl;
}
반응형