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 개념이 없기 때문이다.
하지만 정적 멤버 함수의 경우, 일반 함수 포인터에 대입될 수 있다.
피드 구독하기:
댓글 (Atom)
[C++] meta programing
재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...
-
Smart Pointer : 포인터처럼 동작하며 자동으로 메모리를 해제하고 안전하게 resource를 관리하도록 돕는 객체 포인터는 소멸자가 호출되지 않아 memory leak이 발생한다. Java, C#같은 VM이 있는 언어는 VM에서 G...
-
nullptr 란? C++11 에서 지원하는 null pointer 상수 먼저 pointer 가 초기화될 수 있는 정수 값을 살펴보자. 정수 0은 모든 타입의 포인터에 암시적 형변환을 통해서 초기화 값으로 사용될 수 있다. 하지만 그 이...
-
자료 구조를 순회하여 데이터에 접근하는 방법을 살펴보자. Container 에 저장된 데이터에 접근하기 위해 대표적으로 Iterator의 begin(), end() function 을 사용한다. 하지만 위 예제에서 show() 함수에 배열이...
댓글 없음:
댓글 쓰기