1. 程式人生 > >C++函式指標和函式物件

C++函式指標和函式物件

C++裡有函式指標和函式物件,讓我們來看下這2個的區別

一 函式指標

我們在學習C/C++時,有時會要寫一個函式,這個函式的引數是另外一個函式,一種寫法如下,

#include <iostream>

using namespace std;

void test(void (func)(int)) // 引數是另外一個函式
{
    func(100);
}

void fn(int data)
{
    cout << "data is " << data << "\n";
}

int main()
{
    test(fn); // 把fn作為引數傳遞給test()
return 0; }

很明顯,這種寫法比較麻煩,整個函式宣告都寫在引數裡,如果有多個函式的引數是另一個函式,那麼就非常不好了。

所以,一般我們會使用typedef來定義一個函式型別,然後宣告一個接受函式作為引數的函式時,就可以直接使用這個函式型別來定義這種引數,如下,

#include <iostream>

using namespace std;

typedef void func(int); // 函式型別定義

void test(func * pFunc) // 注意*
{
    pFunc(100);
}


void fn(int data)
{
    cout <<
"data is " << data << "\n"; } int main() { test(fn); return 0; }

這種寫法的好處是可以讓人一眼就看出來這是個指標。

還有一種經常見到的寫法,如下,

#include <iostream>

using namespace std;

typedef void (*func)(int); // 函式型別定義,多了圓括號和*

void test(func pFunc) // 沒有*
{
    pFunc(100);
}


void fn(int data)
{
    cout <<
"data is " << data << "\n"; } int main() { test(fn); // 呼叫方式和第2 return 0; }

這種寫法是把函式指標直接定義為一個型別,使用該型別定義的變數就是函式指標變數。

所以,函式指標寫法總共有3種,後面2種比較簡潔方便,用的也比較普遍。函式指標可以讓我們編寫引數是函式的函式,也可以用來直接定義函式指標變數。

二 函式物件

函式物件的本質是一個類,如果類過載了函式呼叫運算子,那麼該類的物件就是函式物件。我們可以像使用函式一樣使用該類的物件。
另外函式物件可以儲存狀態,所以比普通函式更加靈活。

下面是個簡單的函式物件的例子,

#include <iostream>

class FUNC
{
public:
    FUNC() : helper(0)
    {
    }

    void operator() (int data)
    {
        std::cout << "data is " << data+helper << "\n";
        helper += data;
    }

private:
    int helper;
};

int main()
{
    FUNC obj;
    obj(200);
    obj(200);

    return 0;
}

輸出如下,
在這裡插入圖片描述
可以看出由於函式物件可以儲存狀態,所以兩次執行obj(200)輸出不一樣。

也可以像函式指標一樣作為函式引數,

#include <iostream>

class FUNC
{
public:
    FUNC() : helper(0)
    {
    }

    void operator() (int data)
    {
        std::cout << "data is " << data+helper << "\n";
        helper += data;
    }

private:
    int helper;
};


void fn(FUNC& obj)
{
    obj(200);
    obj(200);
}

int main()
{
    FUNC obj;
    fn(obj);

    return 0;
}

三 總結

相關推薦

C++中的函式指標函式物件總結

篇一、函式指標函式指標:是指向函式的指標變數,在C編譯時,每一個函式都有一個入口地址,那麼這個指向這個函式的函式指標便指向這個地址。函式指標的用途是很大的,主要有兩個作用:用作呼叫函式和做函式的引數。函式指標的宣告方法:資料型別標誌符 (指標變數名) (形參列表);一般函式的宣告為:int func ( in

C++函式指標函式物件

C++裡有函式指標和函式物件,讓我們來看下這2個的區別 一 函式指標 我們在學習C/C++時,有時會要寫一個函式,這個函式的引數是另外一個函式,一種寫法如下, #include <iostream> using namespace std; vo

C++中的函式指標函式物件總結(轉)

篇一、函式指標函式指標:是指向函式的指標變數,在C編譯時,每一個函式都有一個入口地址,那麼這個指向這個函式的函式指標便指向這個地址。函式指標的用途是很大的,主要有兩個作用:用作呼叫函式和做函式的引數。函式指標的宣告方法:資料型別標誌符 (指標變數名) (形參列表);一般函式的宣告為: int func ( i

C++複習筆記(六)之函式指標函式模板、類模板

一、函式指標 函式指標在C語言中的作用類似於c++中的多型,都是可以實現框架的搭建,程式碼的相容性高。 函式三要素:名稱、引數、返回值 C語言可以通過typedef為函式型別重新命名,語法 typedef  返回值型別(型別名稱)(引數列表);如下程式碼所示: #in

函式指標函式物件詳解

一、函式指標 在C++中,指標本質就是記憶體中的某個地址,如果該記憶體地址中存放的是某個資料,那麼這個指標就是常見的資料指標,如果這個記憶體地址中存放的是某個函式,那麼這個指標就是函式指標。 C++中每一個函式都有一個入口地址,該入口地址就是函式指標所指向的

回撥函式函式指標函式物件

  對於回撥函式的編寫始終是寫特殊處理功能程式時用到的技巧之一。先介紹一下回調的使用基本方法與原理。   在這裡設:回撥函式為A()(這是最簡單的情況,不帶引數,但我們應用的實際情況常常很會複雜),使用回撥函式的操作函式為B(), 但B函式是需要引數的,這個引數就是指向函

函式指標 函式物件

函式指標: 函式指標:指向函式的指標變數。本身首先應是指標變數,只不過該指標變數指向函式。這正如用指標變數可指向整型變數、字元型、陣列一樣,這裡是指向函式。如前所述,C在編譯時,每一個函式都有一個入口地址,該入口地址就是函式指標所指向的地址。有了指向函式的指標變數後,可用該

函式指標函式物件的比較

一、函式指標 函式指標:是指向函式的指標變數,在C編譯時,每一個函式都有一個入口地址,那麼這個指向這個函式的函式指標便指向這個地址。 函式指標的用途是很大的,主要有兩個作用:用作呼叫函式和做函式的引數。 函式指標的宣告方法: 資料型別標誌符 (指標變數名

函式指標函式指標型別

參考:https://blog.csdn.net/candyliuxj/article/details/6339414 函式指標 1.     定義 每一個函式都佔用一段記憶體單元,它們有一個起始地址,指向函式入口地址的指標稱為函式指標。

函式指標函式指標陣列及其應用

1. 函式指標 先來看一個簡單的例子。 int a=3; void *p=&a; 這是一個基礎的不能再基礎的例子。相信學過指標的都能看得懂。P是一個指標,指向a。a 是一個整形變數。 函式指標和其類似,只不過其指向的不是一個變數,而是一個函式,僅此而已。話不多

c語言的指標陣列陣列指標函式指標

#include <stdio.h> #include <stdlib.h> int func(int x){ return x; } int* func2(int x){ int *p=&x; return

C語言指標回顧——函式指標指標函式

函式指標 函式指標和指標函式兩個詞很像,但實際上只要看後兩個詞就行,函式指標是一個指標,指標是用來存放變數地址的,函式指標存放的地址是函式的入口地址。那麼函式指標如何使用呢,請看下面的程式碼: #include <iostream> using namespa

c/c++中的函式指標指標函式

定義 1.指標函式,本質是函式,返回值為指標,形如,int *pfun(int, int),由於“*”的優先順序低於“()”的優先順序,所以等同於int *(pfun(int, int)) 2.函式指標

C語言 函式指標 typedef

函式 函式一般遵循的格式:函式的返回型別、函式名、引數列表; void func(void) --> 對應的指標 void (*P)(void) typedef定義函式指標 typedef int (*funptr)(int,int) // typedef行 int (*

C語言:通過函式指標引數來呼叫函式

C語言可以通過函式指標來呼叫函式,可以將要呼叫的函式名儲存到陣列中。這樣我們可以通過引數來直接呼叫函數了。 #include <stdio.h> #define FUNCTIONSIZE 2 typedef unsigned char uint8_t;

c++中的函式指標類成員函式指標

// // main.cpp // Demo // // Created by 杜國超 on 16/12/28. // Copyright © 2016年 杜國超. All rights reserved. // #include using namespace std; class MYCla

C++基礎之八】函式指標回撥函式

C++很多類庫都喜歡用回撥函式,MFC中的定時器,訊息機制,hook機制等待,包括現在在研究的cocos2d-x中也有很多的回撥函式。1.回撥函式什麼是回撥函式呢?回撥函式其實就是一個通過函式指標呼叫的函式!假如你把A函式的指標當作引數傳給B函式,然後在B函式中通過A函式傳進

C語言指標導學(4)——分清函式指標指標函式

四.分清函式指標和指標函式 關於指標和陣列斬不斷理還亂的恩怨還真是說了不少,不過現在應該已經理清了。有了上一講的基礎,本講的內容相對來說就比較容易理解了。 1.指向函式的指標(函式指標) 來分析這樣一個宣告,void (*f) ( );雖然( )的優先順序高於*,但由於有括號

靜態成員函式、this指標物件指標動態物件使用小結

·靜態成員函式就是使用static 關鍵字宣告的成員函式  在類外實現時不加static關鍵字,只有在類內宣告時才加static·靜態成員函式是類的一部分,作用是為了處理靜態資料成員  沒有this指標·靜態成員函式可以直接訪問該類的靜態成員,但不能直接訪問類中的非靜態成員·若想在靜態成員fun中使用非靜態成

C語言實現動態陣列 C語言函式指標回撥函式

實現任意資料型別的動態陣列的初始化,插入,刪除(按值刪除;按位置刪除),銷燬功能。、 動態陣列結構體   實現動態陣列結構體的三個要素:(1)陣列首地址;(2)陣列的大小;(3)當前陣列元素的個數。 1 //動態陣列結構體 2 struct DynamicArray{ 3 void **a