c++裡有函式指標和函式物件,讓我們來看下這2個的區別
我們在學習c/c++時,有時會要寫乙個函式,這個函式的引數是另外乙個函式,一種寫法如下,
#include
using namespace std;
void
test
(void
(func)
(int))
// 引數是另外乙個函式
voidfn(
int data)
intmain()
很明顯,這種寫法比較麻煩,整個函式宣告都寫在引數裡,如果有多個函式的引數是另乙個函式,那麼就非常不好了。
所以,一般我們會使用typedef來定義乙個函式型別,然後宣告乙個接受函式作為引數的函式時,就可以直接使用這個函式型別來定義這種引數,如下,
#include
using namespace std;
typedef
void
func
(int);
// 函式型別定義
void
test
(func * pfunc)
// 注意*
voidfn(
int data)
intmain()
這種寫法的好處是可以讓人一眼就看出來這是個指標。
還有一種經常見到的寫法,如下,
#include
using namespace std;
typedef
void
(*func)
(int);
// 函式型別定義,多了圓括號和*
void
test
(func pfunc)
// 沒有*
voidfn(
int data)
intmain()
這種寫法是把函式指標直接定義為乙個型別,使用該型別定義的變數就是函式指標變數。
所以,函式指標寫法總共有3種,後面2種比較簡潔方便,用的也比較普遍。函式指標可以讓我們編寫引數是函式的函式,也可以用來直接定義函式指標變數。
函式物件的本質是乙個類,如果類過載了函式呼叫運算子,那麼該類的物件就是函式物件。我們可以像使用函式一樣使用該類的物件。
另外函式物件可以儲存狀態,所以比普通函式更加靈活。
下面是個簡單的函式物件的例子,
#include
class func
void
operator()
(int data)
private:
int helper;};
intmain()
輸出如下,
可以看出由於函式物件可以儲存狀態,所以兩次執行obj(200)輸出不一樣。
也可以像函式指標一樣作為函式引數,
#include
class func
void
operator()
(int data)
private:
int helper;};
void
fn(func& obj)
intmain()
c 函式指標和函式物件
三 函式指標 四 函式物件 博主認為,要想正確深入了解c 中的函式型別和函式指標,就應當首先了解在c 中成員函式在記憶體中的儲存方式。因此,本文會按照從基礎概念到實際應用,由表及裡的順序撰寫博主對函式指標和函式型別的理解。c 中的記憶體劃分為以下四個部分 1 全域性資料區 data area 2 區...
函式指標和函式物件
函式指標分為全域性函式指標和類成員函式指標.函式指標型別為全域性函式.include stdafx.h using namespace std class testaction typedef void fp int void drink int i void eat int i class tes...
C 函式指標和函式物件的總結
轉自 篇一 函式指標 函式指標 是指向函式的指標變數,在c編譯時,每乙個函式都有乙個入口位址,那麼這個指向這個函式的函式指標便指向這個位址。函式指標的用途是很大的,主要有兩個作用 用作呼叫函式和做函式的引數。函式指標的宣告方法 資料型別標誌符 指標變數名 形參列表 一般函式的宣告為 int func...