함수 객체(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++ ] 함수포인터, 멤버 함수포인터 (velog.io)

'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

+ Recent posts