본문 바로가기

C++

C++ 함수포인터

함수포인터

함수의 주소를 저장하는 포인터

 

우리가 항상 사용해 왔던 함수도 사실 주소값이 해당 함수의 내용을 가르키고있는것이다.

즉 함수의 이름은 포인터이다.

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)(intint= Add;
    cout << ptr(1020<< 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])(intint= { Add , Min};
    cout << ptr[0](1020<< endl;
    cout << ptr[1](1020<< 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)(intint);
 
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(*)(intint);
 
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(intint)> 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