함수 포인터
-> 함수의 주소를 저장하는 변수
-> 함수 포인터는 코드 영역에 들어간다.
-> 할당 시점 : 프로그램 시작시
-> 할당 종료 : 프로그램 종료시
함수를 호출할 때 함수명 + ()를 이용한다.
-> 연산자 ()를 제거하면 함수명만 남게된다.
-> 함수명은 함수의 주소를 가지고 있다.
-> cout을 통해 함수명만 호출하면 함수의 주소가 나오게된다.
함수 포인터의 형태
int Add(int _a, int _b)
{
return _a + _b;
}
반환타입(* 변수명) (인자타입, 인자타입, 인자타입... )
int(*ptr)(int, int) = Add;
cout << ptr(10, 20) << endl;
일반 함수 switch 사용
int iA = 0, iB = 0, iSelect = 0, iRes = 0;
cin >> iA >> iB;
cout << "1.더하기 2.빼기 3.곱하기 4.나누기" << endl;
cout << "============================================" << endl;
cout << "입력: ";
cin >> iSelect;
switch (iSelect)
{
case 1:
iRes = Add(iA, iB);
break;
case 2:
iRes = Min(iA, iB);
break;
case 3:
iRes = Mul(iA, iB);
break;
case 4:
iRes = Div(iA, iB);
break;
default:
break;
}
cout << "연산 결과: " << iRes << endl;
함수 포인터 switch 사용
int iA = 0, iB = 0, iSelect = 0, iRes = 0;
cin >> iA >> iB;
cout << "1.더하기 2.빼기 3.곱하기 4.나누기" << endl;
cout << "============================================" << endl;
cout << "입력: ";
cin >> iSelect;
int(*ptr)(int, int) = nullptr;
switch (iSelect)
{
case 1:
ptr = Add;
break;
case 2:
ptr = Min;
break;
case 3:
ptr = Mul;
break;
case 4:
ptr = Div;
break;
default:
break;
}
cout << "연산 결과: " << ptr(iA, iB) << endl;
switch를 통해 함수 포인터를 사용하였는데 코드가 너무 길다고 판단이 된다.
이를 해결하기 위해서 함수 포인터의 배열을 사용해보자.
함수 포인터 배열 사용
int Add(int _a, int _b)
{
return _a + _b;
}
int Min(int _a, int _b)
{
return _a - _b;
}
int Mul(int _a, int _b)
{
return _a * _b;
}
int Div(int _a, int _b)
{
return _a / _b;
}
int iA = 0, iB = 0, iSelect = 0, iRes = 0;
cin >> iA >> iB;
int(*ptr[4])(int, int) = { Add, Min, Mul, Div };
cout << "연산 결과: " << ptr[iSelect - 1](iA, iB) << endl;
switch문을 사용했을 때와 결과는 같고 훨씬 더 코드가 간결해진 것을 볼 수 있다.
'Programming > C++ Basic' 카테고리의 다른 글
C++ 조건부 컴파일(#if, #ifdef, #ifndef 등) (0) | 2020.09.07 |
---|---|
C++ 매크로(#define) (0) | 2020.09.07 |
C++ 공용체(union) (0) | 2020.09.07 |
C++ 열거체(enum) (0) | 2020.09.06 |
C++ 경로 (0) | 2020.09.02 |