C++프로그래밍/자료구조,알고리즘(추후확장)

함수객체

season97 2024. 9. 27. 09:44

※ 개인적인 복습 및 공부를 위해 포스팅 하는 글이므로 구체적이지 않을 수 있으며

틀린게 있다면 지적부탁드립니다


▶ 함수포인터 사용법과 단점

 

# 함수 포인터 사용법 복습

void HelloWorld()
{
    cout << "Hello World" << endl;
}

int main()
{
    void (*pFunc)(void);

    //동작을 넘겨줄 때 유용
    pFunc = &HelloWorld;
    (*pFunc)();
}


◆ 함수 포인터의 단점?

 

1) 시그니처가 안맞으면 사용할 수 없다... 예를들어 아래 코드를 보면

void HelloNum(int n)
{
	cout << "num" << endl;
}

void (*pFunc)(void);
pfunc = &HelloNum; <-- 안댐

ㆍ 매개변수가 안맞으면 안된다는 것!

 

2) 상태를 가질 수 없다

class Knight
{
public:
    void AddHp(int addHp)
    {
        _hp += addHp;
    }

private:
    int _hp = 100;
};

ㆍ 이런 객체가 가지고 있는 상태를 가질 수없다. (맴버변수 등등)

 

 


 

▶ 함수 객체

 

ㆍ 함수처럼 동작하는 객체

 

ㆍ 함수 포인터의 단점이 보완이 된다.

 

[함수처럼 동작]하는 객체.... ()연산자 오버로딩!

 

ㆍ 사용하려면 () 연산자를 오버로딩해서 사용하면 된다.

class Functor
{
public:
    //()연산자 오버로딩
    void operator()() 
    {
        cout << "Functor테스트" << endl;
        cout << _value << endl;
    }

    bool operator()(int n)
    {
        cout << "Functor Test" << endl;
        _value += n;
        cout << _value << endl;
        return true;
    }
    // 다양한 오버로딩 가능

private:
    int _value = 4;
};
Functor functor;
functor();
// 함수포인터와는 다르게 상태값도 들고있을 수 있다! 

bool ret = functor(3);

※ 그냥 간단하게 설명하면 () 연산자를 오버로딩해 함수처럼 동작하게 되는 객체를 의미한다.

 


 

'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글

vector의 동작 원리(size / capacity)  (0) 2024.09.28
콜백함수  (0) 2024.09.27
클래스 템플릿  (0) 2024.09.27
템플릿 기초 (함수템블릿)  (0) 2024.09.27
함수포인터  (0) 2024.09.26