함수포인터
함수의 주소를 저장하는 포인터
우리가 항상 사용해 왔던 함수도 사실 주소값이 해당 함수의 내용을 가르키고있는것이다.
즉 함수의 이름은 포인터이다.
1
2
3
4
5
|
|
void Function() { }
void main()
{
cout << Function << endl;
}
|
cs |
해당 코드를 실행시키면 Function의 주소값이 출력이됩니다. 즉 해당 함수의 주소값을 포인터의 저장시켜
사용하는게 함수 포인터입니다.
함수포인터의 형태
반환타입(클래스명* 변수명) (매개변수);
클래스 명의 경우 해당 함수가 들어있는 클래스 이름을 넣어주면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
|
|
int Add(int num1, int num2)
{
return num1 + num2;
}
void main()
{
int num1 = 10;
int num2 = 20;
int(*ptr)(int, int) = Add;
cout << ptr(10, 20) << endl;
}
|
cs |
10행 : 반환값이 int이고 매개변수로 int값2개를 받는 함수의주소를 받을수있는 포인터를 만들었다
11행 : 함수호출자처럼 똑같이 사용하여 함수포인터의 정의되어있는 함수를 호출
함수포인터 배열의 형태
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
|
int Add(int num1, int num2)
{
return num1 + num2;
}
int Min(int num1, int num2)
{
return num1 - num2;
}
void main()
{
int num1 = 10;
int num2 = 20;
int(*ptr[2])(int, int) = { Add , Min};
cout << ptr[0](10, 20) << endl;
cout << ptr[1](10, 20) << endl;
}
|
cs |
14행 : 함수포인터의 배열선언 2개의 배열선언 이후 인자값으로 Add와 Min을 넣어주었다.
15~16행 : 사용법은 기존과동일하고 배열과 동일하다
함수포인터는 무조건 반환값과 매개변수의 갯수가 동일해야만 사용 가능하기때문에 둘중 하나라도 다를경우
함수포인터의 해당 함수의 주소를 넘길수없다.
함수포인터 이쁘게 만들기
typedef을 이용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
|
typedef int(*ptr)(int, int);
int Add(int num1, int num2)
{
return num1 + num2;
}
int Min(int num1, int num2)
{
return num1 - num2;
}
void main()
{
int num1 = 10;
int num2 = 20;
ptr Fptr[2] = { Add , Min};
cout << Fptr[0](num1, num2) << endl;
cout << Fptr[1](num1, num2) << endl;
}
|
cs |
1행 : typedef을 이용하여 포인터 함수를정의하여 ptr이라는 변수명 생성
16행 : int(*변수명)(int,int)대신 ptr로 간단하게 정의
using을 이용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
|
using ptr = int(*)(int, int);
int Add(int num1, int num2)
{
return num1 + num2;
}
int Min(int num1, int num2)
{
return num1 - num2;
}
void main()
{
int num1 = 10;
int num2 = 20;
ptr Fptr[2] = { Add , Min};
cout << Fptr[0](num1, num2) << endl;
cout << Fptr[1](num1, num2) << endl;
}
|
cs |
1행 : using으로 정의
function을 이용하기
C++11에서는 표준 라이버르 <function> 헤더에 정의되어 있는 std::function을 이용해서 함수 포인터를 정의할수있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
|
#include <iostream>
#include <functional>
using namespace std;
int Add(int num1, int num2)
{
return num1 + num2;
}
int Min(int num1, int num2)
{
return num1 - num2;
}
void main()
{
int num1 = 10;
int num2 = 20;
function<int(int, int)> ptr[2] = { Add,Min };
cout << ptr[0](num1, num2) <<endl;
cout << ptr[1](num1, num2) << endl;
}
|
cs |
2행 : function을 사용하기 위해서 전처리기 정의
18행 : function을 이용하여 함수포인터배열생성
'C++' 카테고리의 다른 글
C++ 조건부 컴파일 (0) | 2020.09.07 |
---|---|
C++ 매크로,매크로 함수 (0) | 2020.09.07 |
C++ 연산자 오버로딩 주의사항 (0) | 2020.09.06 |
C++ 연산자 오버로딩(Operator Overloading) (0) | 2020.09.06 |
C 파일입출력 (0) | 2020.09.04 |