C 函式指標和函式物件

2021-09-30 17:09:36 字數 1748 閱讀 2850

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...