함수 객체(Functor)
함수 호출 연산자 operator()를 오버로딩하는 클래스 또는 구조체.
객체를 함수처럼 쓰는 방법.
struct AddFunctor {
int operator()(int a, int b) {
return a + b;
}
};
AddFunctor add;
int result = add(5, 3); // result는 5 + 3인 8이 됩니다.
그런데 함수 객체는 람다식을 써서 익명 함수 객체를 그 자리에서 바로 만들 수 있는데 처음엔 함수 포인터인줄 알고 헷갈림.
struct SomeUniqueName {
int operator()(int a, int b) {
return a + b;
}
};
|
|
▽
auto add = [](int a, int b) { return a + b; }; //auto 는 int일 듯. 반환형
함수 포인터
함수의 주소를 받는 포인터 변수.
[자료형] (*이름)(인수, 인수....) 형태로 같은 형식의 함수를 저장한다.
매개변수로 다른 함수를 가져오고 싶을 때 사용 가능. ( ex.콜백 함수 등록)
int AddFunction(int a, int b) {
return a + b;
}
int (*add)(int, int) = AddFunction;
int result = add(5, 3); // result는 5 + 3인 8이 됩니다.
Class 멤버함수의 함수포인터 사용
class의 멤버함수도 함수포인터로 사용이 가능.
하지만 class내부의 멤버함수는 객체를 통해서만 출력이 가능하고,
함수포인터의 선언 또한 해당 클래스의 범위 내에있는 함수포인터라고 명시해줘야 사용이 가능하다.
class Test
{
public:
int add(int a, int b) //클래스 Test안에 멤버함수 add가 있습니다.
{
return (a + b);
}
};
int main(void)
{
Test test;
int (Test::*f)(int, int) = &Test::add;
//함수포인터 f는 Test의 멤버함수를 사용하겠다고 Test::를 통해 명시해줍니다.
//그리고 함수의 주소 또한 Test의 멤버함수라고 명시해 주고 다른 함수 포인터와 달리
//항상 명시적으로 &연산자를 통해 함수의 주소를 가져와야 합니다.
cout << (test.*f)(1, 2) << endl;
//함수포인터의 사용 또한 해당 클래스의 객체를 통해서 사용해야 합니다.
//만약 class의 멤버함수 내에서 함수포인터를 사용한다면 this를 통해서 접근할 수 있습니다.
//접근은 멤버 포인터 연산자인 .* 또는 ->*연산자로 접근해야 합니다.
}
staic Class 멤버함수의 함수포인터 사용
class Test
{
public:
static int add(int a, int b)
{
return (a + b);
}
};
int main(void)
{
int (*f)(int, int) = &Test::add;
cout << f(1, 2) << endl;
//출력은 일반 함수포인터와 동일합니다.
}
함수 포인터를 이름으로 사용
#include <stdio.h>
// 함수 포인터 타입을 정의
typedef void (*MyFunctionPointer)(int);
// 함수 포인터를 사용하는 함수 예제
void myFunction(int value) {
printf("Value: %d\n", value);
}
int main() {
// 새로 정의한 타입으로 함수 포인터 변수 선언
MyFunctionPointer functionPtr = myFunction;
// 함수 포인터 사용
functionPtr(42);
return 0;
}
[출처]
'c, c++ 리마인드' 카테고리의 다른 글
[c++] #define & typedef (0) | 2023.12.13 |
---|---|
C++ friend 함수 (0) | 2023.10.31 |
C++ new / delete (0) | 2023.10.24 |
C++ this 포인터 / 멤버함수 / 가상함수 (0) | 2023.10.24 |
c++ pair, lower_bound/upper_bound 유의 사항 (0) | 2023.09.24 |