C++에서 함수는 정적 함수와 멤버 함수로 나눌 수 있다. 함수 호출 방식은 세 가지가 있다.
1. 정적 함수 호출(정적 함수)
2. 객체로 멤버 함수 호출(멤버 함수)
3. 객체의 주소로 멤버 함수 호출(멤버 함수)
1. 정적 함수 호출(정적 함수) 예제
#include <iostream>
using namespace std;
void Print(int n)
{
cout << "전역 함수 : " << n << endl;
}
namespace A
{
void Print(int n)
{
cout << "namespace A 전역 함수 : " << n << endl;
}
}
class Point
{
public:
static void Print(int n)
{
cout << "Point 클래스의 정적 멤버 함수 : " << n << endl;
}
};
int main()
{
void(*pf1)(int); // 정적 함수 포인터 선언
pf1 = Print;
void(*pf2)(int); // 정적 함수 포인터 선언
pf2 = A::Print;
void(*pf3)(int); // 정적 함수 포인터 선언
pf3 = Point::Print;
pf1(10);
pf2(20);
pf3(30);
return 0;
}
정적 함수는 모두 같은 함수 포인터인 pf를 사용한다. pf는 정적 함수 포인터이다.
2,3. 객체와 주소로 멤버 함수 호출(멤버 함수) 예제
멤버 함수 포인터는 함수 포인터 선언에 어떤 클래스의 멤버 함수를 가리킬 것인지 클래스 이름을 지정해야 한다. 시그니처가 void Point::Print(int n)인 멤버 함수의 포인터는 void(Point::*pf)(int)처럼 선언 합니다. 함수 호출은 다음과 같이 멤버 함수 호출 방법에 따라 다르다.
객체로 멤버 함수 호출 시에는 . 연산자를 이용한다. ex) (객체.*pf)(10)
주소로 멤버 함수 호출 시에는 -> 연산자를 이용한다. ex) (주소->*pf)(10)
#include <iostream>
using namespace std;
class Point
{
int x;
int y;
public:
explicit Point(int _x = 0, int _y = 0) :x(_x), y(_y) {}
void Print() const { cout << "X : " << x << "Y : " << y << endl; }
void PrintInt(int n) { cout << "Point 클래스의 멤버 함수 : " << n << endl; }
};
int main()
{
Point pt(2, 3);
Point *p = &pt;
void (Point::*pf1)() const;
pf1 = &Point::Print;
void (Point::*pf2)(int);
pf2 = &Point::PrintInt;
pt.Print();
pt.PrintInt(10);
cout << endl;
(pt.*pf1)();
(pt.*pf2)(10);
(p->*pf1)();
(p->*pf2)(10);
cout << endl;
return 0;
}