*****************************
在有些程式語言中,函式是「第一級值」。在這些語言中,可以將函式作為函式引數
傳遞,並把它們當作表示式的元件使用等。
c++不屬於這類語言,但這一點並不是顯而易見的。因為對於c++程式而言,將函式作為
引數傳遞,並把它們的位址儲存在資料結構中是很常見的操作。
例如,假設我們想對某個陣列的所有元素都運用某個給定函式。如果這個函式有乙個int
引數,並且生成void型別,我們可以如下編寫**
*****************************
for (int i = 0;i < n;i++)
}*****************************
這是不是說明c++把函式也當作第一級值呢?
本例中第乙個隱蔽之處就是,f雖然看上去像函式,其實根本就不是函式。相反它是乙個
函式指標。和在c中一樣c++不可能有函式型別的變數,所以任何宣告這種變數的企圖都將
立即被轉換成指向函式的指標宣告。和在c中一樣,所有對函式指標的呼叫都等價於這個
指標所指向的函式的呼叫。所以前面的例子就等價於
*****************************
for (int i = 0;i < n;i++)
}*****************************
那又怎麼樣?函式和函式指標之間的有什麼重大差異嗎?這個差異和任何和任何指標與
其所指向的物件之間的差異是類似的:不可能通過操縱指標建立這樣的物件。c++函式的總
儲存空間在程式執行之前就固定了。一旦程式開始執行,就無法建立新函式了。為了理解
為什麼說不能動態建立新函式是個問題,我們來思考一下如何寫乙個c++函式,以便把兩個
函式組合起來生成第三個函式。組合是我們所能想到的建立新函式最簡單的方法之一。現在
為了簡單期間,我們將假設每個函式都有乙個整數引數並返回乙個整數結果。然後,假設我
們有一對函式f和g:
extern int f(int);
extern int g(int);
我們希望能夠使用下面的語句:
int (*h)(int) = compose(f,g);
具有一種特徵,就是對於任何整數n而言,h(n)將等價於f(g(n))。
c++沒有提供直接做這件事的方法。我們可以杜撰如下的**:
int (*compose(int f(int), int g(int) ) )(int x)
return result;
}這裡,compose試圖用兩個函式f和g來定義乙個函式,當應用於x時可以得到f(g(x))的函式;
但是由於兩個原因它不可能成功。第乙個原因就是c++不支援巢狀函式,這意味著result的定義
非法。而且由於result需要在塊作用域之內訪問f和g,所以沒有簡便的方法可以繞過這個限制。
簡單的使result全域性化:
int result(int n)
int (*compose(int f(int), int g(int))) (int x)
{return result;
}這個例子的問題在於f和g在result中沒有定義。
第二個問題更難以捉摸。假設c++允許巢狀函式——畢竟c++實現把它當成一種擴充套件,那麼這樣
做會成功嗎?
可惜的是,答案是「實際不會成功」。為了了解原因,我們稍微修改了一下compose函式:
*****************************
int (*compose (int f(int), int g(int)))(int x)
return result;
}*****************************
其中所做的改變是將f和g的位址複製到兩個區域性變數fp和gp中去。現在,假設我們呼叫compose,
它將返回乙個指向result的指標。因為fp和gp是compose的區域性變數,所以一旦compose返回它們
就消失了。如果我們現在呼叫result,它將試圖使用這些區域性變數,但是這些變數已經被刪除了。
結果很可能導致程式執行崩潰
顯然編寫compose的最後乙個版本,我們應該很容易明白這個程式失敗的原因。然而,第乙個版本
也存在相同的問題。唯一的不同的是第乙個版本中的f和g不是普通的區域性變數,而是形參。這個
區別無關大局:當compose返回時它們也消失;也就是說當result試圖訪問它們時也會導致崩潰。
那麼顯然編寫compose函式除了需要常規的基於堆疊的實現外,還需要某種自動**機制。儘管
c++將垃圾**集作為語言的標準部分會給很多方面帶來好處,但是存在太多的困難使我們不能這
樣定義c++。
write by fgd
C 指標函式和函式指標
1 指標函式 1 基本概念 指標函式 顧名思義就是帶有指標的函式,即其本質是乙個函式,只不過這種函式返回的是乙個對應型別的位址。2 定義式 type func type type 如 int max int x,int y 3 例子詳解 cpp view plain copy 1.include 2...
c 指標函式和函式指標
函式指標與指標函式 1 函式指標 形式 返回型別 函式名 參數列 一種特殊的指標,它指向函式的入口 定義乙個函式指標p,只能指向返回值為int,形參為兩個int的函式 輸出結果 include stdafx.h include using namespace std int p int,int in...
C 函式指標與指標函式
函式指標 函式名本身代表著函式的位址,因此給函數指標賦值使可以不用加 符號 加也可以!void func int 定義乙個函式 void pf int 定義乙個函式指標 pf func 給函式指標賦值 int f x,y 其中x,y是形式引數,f是函式名,呼叫後返回乙個指向整型資料的位址指標。f x...