ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 함수 포인터란 무엇인가
    예전 글들/C, C++ 2011. 2. 11. 13:49
    반응형

    1.      함수 이름은 함수에 대한 상수형 포인터, 이 포인터를 사용하여 함수를 호출 할 수 있다.

    A.     이를 사용하면, 입력 내용에 따라 마음대로 원하는 함수를 호출할 수 있다.

    B.     예시

                    i.         int형을 가리키는 포인터는 정수형을 가리키고, 함수에 대한 포인터는 해당 반환형과 원형부를 지닌 함수를 가리켜야 한다.

    1.      long (*funcPtr) (int);
    funcPtr
    은 정수형 매개변수를 가지며, long형을 반환하는 함수를 가리켜야 한다.

                   ii.         long * Function (int);
    long (*funcPtr) (int);
    첫 번째 Function()은 정수형을 매개변수로 갖고 long형 변수의 포인터를 반환하는 함수. 두 번째 funcPtr은 정수형을 매개변수로 갖고 long형 변수를 반환하는 함수를 가리키는 포인터이다.

    2.      함수에 대한 포인터는 함수 이름 대신 함수에 대한 포인터가 사용된다는 점을 제외하고는 함수와 똑같다.

    A.     원하는 특정 함수를 함수 포인터에 대입할 때는 함수 이름만을 매개변수 없이 대입

    B.     함수 이름을 사용하듯이 함수 포인터를 사용하면 된다. 함수 포인터는 대입한 함수와 반환값과 사용법에 있어서 같아야 한다.

    C.     예시
    long (*pFuncOne) (int, int);
    long SomeFunction (int, int);
    pFuncOne = someFunction;
    pFuncOne(5, 7);

    3.      함수 포인터를 사용하는 이유

    A.     함수 포인터를 쓰는 것이 자유로우며, 함수를 목록으로부터 골라 호출할 수 있기 때문에 프로그램이 명확하게 된다.

    B.     재생되는 코드량을 엄청 줄여주고 프로그램을 더욱 깔끔하게 해주며, 함수 테이블을 만들어 놓고 실행할 때마다 맘대로 호출할 수 있다.

    4.      함수 포인터 배열

    A.     정수형에 대한 배열을 선언하듯이 반환값과 원형부가 똑 같은 함수들의 배열을 만들 수 있다.
    선언: void (*pFuncArray[MaxArray]) (int &, int &);

    5.      함수 포인터를 다른 함수에 전달하는 방법

    A.     함수 포인터(또는 함수 포인터의 배열)는 다른 함수로 전달할 수 있는데, 이때에도 포인터는 원하는 대로 동작한다.
    void PrintVals(void (*) (int &, int &), int &, int &);   //
    함수 포인터 사용하는 함수 선언

    void (*pFunc) (int &, int &);  //
    함수 포인터 선언
    void PrintVals(void (*pFunc) (int &, int &), int &x, int &y)   //
    함수 정의
    {
     cout << “x: “ << x << “y: “ << y << endl;
     pFunc(x, y);
     cout << “x: “ << x << “y: “ << y << endl;
    }

    6.      typedef를 사용한 함수 포인터

    A.     함수 포인터를 간단히 하기 위해 typedef문을 쓸 수 있다. , void를 반환하고 두 개의 정수형 참조자를 취하는 함수 포인터 형으로 선언하는 것이다. 이를 VPF(void pointer function)라고 부른다.
    typedef void (*VPF) (int &, int &);
    VPF pFunc;   //
    선언 방법

    7.      멤버 함수에 대한 포인터

    A.     멤버 함수 포인터를 만드는 것은 함수 포인터를 만드는 것과 문법이 동일

    B.     , 클래스 이름과 범위 연산자(::)를 사용한다. 따라서 만일 pFunc void형을 반환하고 두 개의 정수형을 취하는 Shape 클래스의 멤버 함수 포인터가 되게 하려면, 선언은 다음과 같이 하면 된다.
    void (Shape::*pFunc) (int, int);

    C.     멤버 함수 포인터는 함수 포인터와 같은 방식으로 사용한다. , 호출 할 때마다 정확히 클래스 객체를 적어 주어야 한다.

    8.      멤버 함수 포인터에 대한 배열

    A.     함수 포인터와 같이 멤버 함수 포인터도 배열에 저장될 수 있다.

    B.     배열은 각 멤버 함수의 주소로 초기화 될 수 있고 각 배열의 변위에 의해 호출

    typedef void (Dog::*PDF) () const;
    int main()
    {
     PDF DogFunc[MaxArray] = {
     &Dog::Speak,
     &Dog::Move,
     &Dog::Eat,
     &Dog::Growl,
     ……
     }
     Dog *pDog = 0;
     …….
     …….
     pDog = new Dog;
     (pDog->*DogFunc[Method-1])();  //
    이런 식으로 호출. 멤버 함수로부터 만들어진 테이블을 필요로 할 때, 프로그램을 훨씬 이해하기 쉽고 일기 쉽게 만든다
    .
    }



    출처: 초보자를 위한 C++ 21일 완성
    반응형

    '예전 글들 > C, C++' 카테고리의 다른 글

    이런 기초적인걸 까먹다니;; 변수 적용 범위  (0) 2011.03.03
    객체 지향 프로그래밍  (0) 2011.02.11
    C언어, C++ 이란 무엇인가  (0) 2011.02.11
    합병정렬(MergeSort)_(1)  (0) 2010.12.24
    이분검색(Binary Search)  (0) 2010.12.23

    댓글

Designed by Tistory.