본문 바로가기

프로그래밍/C++

함수 포인터

함수 포인터

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

 

함수의 이름은 함수가 시작하는 시작 주소이다.

 

ex)

void Print(int n)
{
	cout << "정수 : " << n << endl;
}

int main()
{
	// void Print(int n)의 함수 포인터 선언이다.
	void (*pf)(int);
	// 함수의 이름은 함수의 시작 주소
	pf = Print;

	Print(10);	// 함수 호출
	pf(10);		// 포인터를 이용한 함수 호출, 첫번째 방법
	(*pf)(10);	// 포인터를 이용한 함수 호출, 두번째 방법

	cout << endl;

	// 함수의 시작 주소
	cout << Print << endl;
	cout << pf << endl;
	cout << *pf << endl;


	return 0;
}

 

정적 함수와 멤버 함수

void Print()
{
	cout << "정적 함수 Print()" << endl;
}

class Point
{
public:
	void Print()
	{
		cout << "멤버 함수 Print()" << endl;
	}
};

int main()
{
	Point pt;
	Point * p = &pt;

	Print();	// 정적 함수 호출
	pt.Print(); // 객체로 멤버 함수 호출
	p->Print(); // 주소로 멤버 함수 호출

	return 0;
}

 

정적 함수

 

 1. 전역 함수

 2. namespace 내의 전역 함수

 3. static 멤버 함수

 

ex)

void Print(int n)
{
	cout << "전역 함수 Print()" << 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(*pf)(int);

	Print(10);
	A::Print(10);
	Point::Print(10);

	pf = Print;
	pf(10);
	pf = A::Print;
	pf(10);
	pf = Point::Print;
	pf(10);

	return 0;
}

 

멤버 함수

 : 객체주소로 각각 호출할 수 있다.

 

ex)

class Point
{
	int x;
	int y;
public:
	explicit Point(int _x = 0, int _y = 0) :
		x(_x),
		y(_y)
	{
	}
	void Print()	const
	{
		cout << x << ',' << y << endl;
	}
	void PrintInt(int n)
	{
		cout << "테스트 정수 : " << 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);
	cout << endl;

	(p->*pf1)();
	(p->*pf2)(10);

	return 0;
}

 

함수 호출 규약

 : 함수 호출시 전달되는 인자의 순서함수가 종료될 때 함수의 스택을 정리하는 시점 등을 약속한 것이다.

  stdcall, cdecl, thiscall, fastcall 등이 있다.

 

정적 함수 기본 함수 호출 규약은 cdecl이다.

멤버 함수는 thiscall을 사용한다.

 

클라이언트가 서버를 호출하면 (call)

서버가 클라이언트를 호출하면 콜백(callback)이라 한다.

 

콜백 메커니즘을 이용하면 알고리즘 정책을 클라이언트에서 유연하게 바꿀 수 있게 서버를 더욱 추상화할 수 있다.

'프로그래밍 > C++' 카테고리의 다른 글

vector의 간략한 소개  (0) 2019.06.20
STL 소개, 컨테이너, 반복자  (0) 2019.06.13
template  (0) 2019.06.09
const와 static  (0) 2019.06.04
복사생성자  (0) 2019.06.03