2015년 9월 30일 수요일

[C++] member function & function pointer


우리는 함수의 포인터를 사용하여 함수를 또 다른 함수의 인자로 또는 반환 타입으로 사용할 수 있다.

포인터 변수 선언 방법은 어떻게 하는가?
타입 * 변수명; (통상 C++은 type에 *를 붙여쓰고, C개발자는 변수명에 붙여씀)

함수 포인터 선언시 필요한 '함수의 타입'은 무엇인가?
예를 들어, int foo() 란 함수를 가리키는
함수 포인터의 타입은 int를 return 하고 parameter 가 없는 것이다.


함수 포인터 변수 선언은 리턴타입(*변수명)([매개변수]); 으로 작성한다.
함수 호출 시, 함수 호출 연산자(()) 를 사용해야 함을 유의하자.

static function 또한 함수 포인터로 할당할 수 있다.
다만 static_function 은 this 개념이 없지만,
C언어의 전역 변수와 동일한 개념이고, Clazz 라는 namespace에 종속되어 있는 것이 차이가 있을 뿐이다.
따라서 Clazz namespace 를 통한 참조로 접근할 수 있다.

멤버 함수를 함수 포인터로 할당하는 경우를 주의해야 한다.
명시적으로 & 를 붙여줘서 해당 객체에 접근하도록 한다.
하지만 mfp() 호출은 불가능 하다. this 를 참조할 수가 없기 때문인데,
객체의 주소는 레지스터에 저장되어 있기 때문에, 명시적으로 넘겨줄 수 없다.

이런 경우 .* 연산자가 필요하다.(조금 생소하지만 C++ 창시자가 이렇게 만들었다..)
.* 좌측에는 객체가 와야 한다.
하지만 만약 좌측에 온 객체가 포인터라면 ->* 연산자를 사용한다.
->* 연산자는 하나로 봐야하고, 좌측의 객체는 포인터여야 한다.

정리하자면, 일반 멤버 함수는 C언어의 함수포인터로 저장될 수 없다.
함수 포인터에 this 개념이 없기 때문이다.
하지만 정적 멤버 함수의 경우, 일반 함수 포인터에 대입될 수 있다.








댓글 없음:

댓글 쓰기

[C++] meta programing

재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...