2016-06-07 2 views
0

저는 C++에서 함수 포인터에 대해 배우고 있습니다. 다음 예제는 모두 예상 결과를 컴파일하고 반환하지만 예제 3은 갈 길이라고 배웠습니다. 왜 다른 예제들이 여전히 효과가 있습니까?C++의 함수 포인터 구문

이상한 것처럼 보인 다른 예가 위의 예제와 달리 모든 예제가 작동하는 f,g,h,i입니다. 예제 1-8과 비교하면 왜 작동하지 않습니까?

int executeOperator1(int a, int b, int f(int,int)){ 
    return f(a,b); 
} 

int executeOperator2(int a, int b, int f(int,int)){ 
    return (*f)(a,b); 
} 
int executeOperator3(int a, int b, int (*f)(int,int)){ 
    return f(a,b); 
} 

int executeOperator4(int a, int b, int (*f)(int,int)){ 
    return (*f)(a,b); 
} 

int op(int x, int y){ 
    return x+y; 
} 


int main(int argc, char *argv[]) 
{ 
    int a = 2, b=3; 
    //the following 8 examples compile nicely: 
    cout << "a=" << a << " b=" << b << " res=" << executeOperator1(a,b,op) <<endl; //1 
    cout << "a=" << a << " b=" << b << " res=" << executeOperator2(a,b,op) <<endl; //2 
    cout << "a=" << a << " b=" << b << " res=" << executeOperator3(a,b,op) <<endl; //3 
    cout << "a=" << a << " b=" << b << " res=" << executeOperator4(a,b,op) <<endl; //4 
    cout << "a=" << a << " b=" << b << " res=" << executeOperator1(a,b,&op) <<endl; //5 
    cout << "a=" << a << " b=" << b << " res=" << executeOperator2(a,b,&op) <<endl; //6 
    cout << "a=" << a << " b=" << b << " res=" << executeOperator3(a,b,&op) <<endl; //7 
    cout << "a=" << a << " b=" << b << " res=" << executeOperator4(a,b,&op) <<endl; //8 

    //int f(int,int) = op; //does not compile 
    int (*g)(int,int) = op; //does compile 
    //int h(int,int) = &op; //does not compile 
    int (*i)(int,int) = &op;//does compile 
    return 0; 
} 

답변

1

기능, 함수에 인수로 전달 될 때, 포인터로 붕괴 배열과 같은. 예를 들어 : 두 개의 int 매개 변수를 사용하고 int을 반환하는 함수의 유형은 int (*) (int, int)입니다.
그러나 함수를 참조로 전달할 수도 있습니다.이 경우 유형은 int (&) (int, int)입니다. 좀 더 알 수있는 바와 같이

typedef int (*FuncType) (int, int); 
FuncType myFunc = op; 
// OR 
FuncType myFunc = &op; 

두 번째 방법은 일반적으로 preffered하지만, 컴파일러의 대부분은 사용자가 첫 번째 스타일로 멀리하자 : 는 간단하게 작성합니다 위의 함수 포인터의 타입의 값을 선언합니다.

아래 링크로 이동하는 것이 좋습니다. http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_functions

0

당신이 사용하는 경우 : main (또는 함수의 인수가 아닌 임의의 장소)에서

int f(int,int); 

, 그것은 함수가 아닌 함수에 대한 포인터로 f를 선언합니다. 따라서, 당신은 함수에 대한 포인터로 한편

int f(int,int) = op; 

,

int (*g)(int,int) = op; 

g를 선언을 사용할 수 없습니다. 그러므로, 그것은 작동합니다.

int f(int,int)을 함수의 인수로 사용하면 int (*f)(int, int)을 부르는 것과 같습니다.

2

훌륭한 소위 때문에 포인터 붕괴 규칙 때문에 모든 예제가 작동합니다. 함수 이름 은 거의 모든 컨텍스트에서 함수 포인터로을 소멸시킵니다. (붕괴은 원래 유형 정보가 손실되었음을 의미하며 나머지는 포인터입니다. 배열은 특정 상황에서 포인터로도 쇠퇴합니다.

모든 예제는 의미 상 동일한 것이므로 어떤 것도 호출하지 않습니다. 을 선호합니다.

그리고 단지 그것의 재미를 위해,이 너무 컴파일 것 :

int executeOperator_insane(int a, int b, int f(int,int)){ 
    return (***************f)(a,b); 
}