関数のポインタを指す少しの理解

6557 ワード

関数のポインタを指す少しの理解
正確に言えば、本文に関連する内容はC++の中で理解しにくい.本文の目的はそれらをはっきり説明することではない.これはあなたが順番に漸進的に多くの練習をしなければならないからだ.次の例を見てみましょう.

				int 
				(*func(
				bool 
				real))(
				int
				, 
				int
				)
		

戻り値は何だと思いますか?
ここでは,関数を指すポインタをどのように理解するかについて述べる.いくつかのC++教材からの提案は中から外へこの表現式を解読することで、ここでいわゆる中はfunc(bool real)で、残りの部分はいわゆる戻り値ですか?ちょっと硬いかな.次は、どのように理解すればいいかを順番に見てみましょう.
この式の戻り値に疑問を抱くのはなぜですか?
問題を解決するには、通常、問題の所在を見つける必要があります.ここでは、変数を宣言する方法に慣れているという考え方に基づいています.
int a;
ここではaがintタイプの変数であることを宣言する.戻り値についても、intタイプの戻り値を持つ関数は、通常、次のように宣言できます.
int func([params]);
したがって,戻り値は最も左側のタイプ名であると慣性的に考えられるが,これは通常正しいが,上記の例では気まずい.
関数を指すポインタの宣言式を見てみましょう.

				int 
				(*
				pCompare)(
				int
				, 
				int
				);
		

このポインタの名前はpCompareですが、不思議なことにpCompareは宣言式全体の右端ではなく、タイプもintではなく複雑な式です.typedefで宣言すると、typedefの使用も違います.

				typedef int 
				(*
				PF
				)(
				int
				, 
				int
				);
		

私たちは慣用的なtypedef***と???を発見しました.上記のtypedefの後、式全体を簡略化することができます.

				PF pCompare;
		

今では、現在の式は規則的に見え、通常の宣言はタイプ名と変数名で宣言を完了し、関数ポインタの宣言は式の固定された位置で宣言されています.
 

				int 
				(*
				)(
				int
				, 
				int
				);
		

上で線を引いた部分が宣言された部分であり、その違いが私たちを徐々に方向を見失わせている.
次に、関数を指すポインタを返す関数、すなわち戻り値がPFの関数を書きます.これは、intタイプの変数を返す関数からintタイプの値を返す関数までのように、次の方法で行えます.
PF func([params]);
PFを拡張し,それを復元し,すなわち右側のfunc([params])部分をその横線の位置に移す.本稿の冒頭の関数を簡単に理解できます.元はint(*)(int,int)を返す関数です.

				int 
				(*func(
				
						bool 
				
				
						real))(
				int
				, 
				int
				)
		

上に線を引いた部分は、1つの関数から戻り値を差し引いた部分です.に等しい

				PF 
				func(
				bool 
				real)
		

これでもっと複雑な表現を分析できるはずです.
次の例は、本明細書の理解を支援することを目的としています.
/*
 * main.cc * *  Created on: 2009-2-1 *      Author: Volnet 
*/
#include 
<
stdlib.h
>
#include 
<
iostream
>
using
 std::cout;
using
 std::endl;
int
 myCompare1(        
int
 a, 
int
 b,        
int
 (
*
Compare)(
int

int
));
int
 realCompare(
int
 a, 
int
 b);
int
 fakeCompare(
int
 a, 
int
 b);typedef 
int
 (
*
PF)(
int

int
);
int
 myCompare2(        
int
 a, 
int
 b,        PF Compare);PF getAPointerFunc1(
bool
 real);
int
 (
*
getAPointerFunc2(
bool
 real))(
int

int
);
int
 main(
void
){    
int
 typeDeclared;    typeDeclared 
=
 
1
;    
//
PF pCompare;
    
int
 (
*
pCompare)(
int

int
);    
if
(pCompare 
==
 NULL)        cout
<<
"
pCompare == NULL
"
<<
endl;    
else
    {        cout
<<
"
pCompare != NULL
"
<<
"
 pComapre = 
"
<<
pCompare
<<
endl;    }    cout
<<
"
Compare the pointer function.
"
<<
endl;    cout
<<
"
The compare result is : 
"
<<
        myCompare1(
6

5
, realCompare)
<<
endl;    cout
<<
"
It's the same to invoke realCompare & *realCompare : 
"
<<
        myCompare1(
6

5

*
realCompare)
<<
endl;    cout
<<
"
Using the typedef to predigest definition : 
"
<<
        myCompare2(
8

7
, realCompare)
<<
endl;    cout
<<
"
Return a pointer from a function : 
"
<<
        myCompare2(
10

20
, getAPointerFunc1(
true
))
<<
endl;    cout
<<
"
Return a pointer from a function : 
"
<<
        myCompare2(
20

30
, getAPointerFunc2(
false
))
<<
endl;    
return
 EXIT_SUCCESS;}
int
 myCompare1(        
int
 a, 
int
 b,        
int
 (
*
Compare)(
int

int
)){    
return
 Compare(a, b);}
int
 realCompare(
int
 a, 
int
 b){    cout
<<
"
The realCompare has be invoked.
"
<<
endl;    
if
(a 
==
 b)        
return
 
0
;    
if
(a 
<
 b)        
return
 
-
1
;    
else
        
return
 
1
;}
int
 fakeCompare(
int
 a, 
int
 b){    cout
<<
"
The fackCompare has be invoked.
"
<<
endl;    
return
 
200
;}
int
 myCompare2(        
int
 a, 
int
 b,        PF Compare){    
return
 Compare(a, b);}PF getAPointerFunc1(
bool
 real){    
if
(real)        
return
 realCompare;    
else
 
return
 fakeCompare;}
int
 (
*
getAPointerFunc2(
bool
 real))(
int

int
){    
if
(real)        
return
 realCompare;    
else
 
return
 fakeCompare;}