1. 程式人生 > >C++中的函式指標和函式物件總結

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

篇一、函式指標
函式指標:是指向函式的指標變數,在C編譯時,每一個函式都有一個入口地址,那麼這個指向這個函式的函式指標便指向這個地址。
函式指標的用途是很大的,主要有兩個作用:用作呼叫函式和做函式的引數。
函式指標的宣告方法
資料型別標誌符 (指標變數名) (形參列表);
一般函式的宣告為:
int func ( int x );
而一個函式指標的宣告方法為:
int (*func) (int x);
前面的那個(*func)中括號是必要的,這會告訴編譯器我們宣告的是函式指標而不是宣告一個具有返回型為指標的函式,後面的形參要視這個函式指標所指向的函式形參而定。
然而這樣宣告我們有時覺得非常繁瑣,於是typedef可以派上用場了,我們也可以這樣宣告:

typedef int (*PF) (int x);
PF pf;
這樣pf便是一個函式指標,方便了許多。當要使用函式指標來呼叫函式時,func(x)或者  (*fucn)(x) 就可以了,當然,函式指標也可以指向被過載的函式,編譯器會為我們區分這些過載的函式從而使函式指標指向正確的函式。
例子:
複製程式碼 typedef void (*PFT) ( char ,int ); void bar(char ch, int i) { cout<<"bar "<<ch<<''<<i<<endl; return ; } PFT pft; pft
= bar; pft('e',91); 複製程式碼
例子中函式指標pft指向了一個已經宣告的函式bar(),然後通過pft來實現輸出字元和整型的目的。
函式指標另一個作用便是作為函式的引數,我們可以在一個函式的形參列表中傳入一個函式指標,然後便可以在這個函式中使用這個函式指標所指向的函式,這樣便可以使程式變得更加清晰和簡潔,而且這種用途技巧可以幫助我們解決很多棘手的問題,使用很小的代價就可獲得足夠大的利益(速度+複雜度)。
複製程式碼 typedef void (*PFT) ( char ,int ); void bar(char ch, int i) { cout<<"bar "<<
ch<<''<<i<<endl; return ; } void foo(char ch, int i, PFT pf) { pf(ch,i); return ; } PFT pft; pft = bar; foo('e',12,pft); 複製程式碼
上述例子我們首先利用一個函式指標pft指向bar(),然後在foo()函式中使用pft指標來呼叫bar(),實現目的。將這個特點稍加利用,我們就可以構造出強大的程式,只需要同樣的foo函式便可以實現對不同bar函式的呼叫。

篇二、函式物件
前面是函式指標的應用,從一般的函式回撥意義上來說,函式物件和函式指標是相同的,但是函式物件卻具有許多函式指標不具有的有點,函式物件使程式設計更加靈活,而且能夠實現函式的內聯(inline)呼叫,使整個程式實現效能加速。
函式物件:這裡已經說明了這是一個物件,而且實際上只是這個物件具有的函式的某些功能,我們才稱之為函式物件,意義很貼切,如果一個物件具有了某個函式的功能,我們變可以稱之為函式物件。
如何使物件具有函式功能呢,很簡單,只需要為這個物件的操作符()進行過載就可以了,如下:
class A{ public: intoperator()(int x){return x;} }; A a; a(5);
這樣a就成為一個函式物件,當我們執行a(5)時,實際上就是利用了過載符號()。
函式物件既然是一個“類物件”,那麼我們當然可以在函式形參列表中呼叫它,它完全可以取代函式指標!如果說指標是C的標誌,類是C++特有的,那麼我們也可以說指標函式和函式物件之間的關係也是同前者一樣的!(雖然有些嚴密)。當我們想在形參列表中呼叫某個函式時,可以先宣告一個具有這種函式功能的函式物件,然後在形參中使用這個物件,他所作的功能和函式指標所作的功能是相同的,而且更加安全。
下面是一個例子:
複製程式碼 class Func{ public: intoperator() (int a, int b) { cout<<a<<'+'<<b<<'='<<a+b<<endl; return a; } }; int addFunc(int a, int b, Func& func) { func(a,b); return a; } Func func; addFunc(1,3,func); 複製程式碼
上述例子中首先定義了一個函式物件類,並重載了()操作符,目的是使前兩個引數相加並輸出,然後在addFunc中的形參列表中使用這個類物件,從而實現兩數相加的功能。
如果運用泛型思維來考慮,可以定一個函式模板類,來實現一般型別的資料的相加:
複製程式碼 class FuncT{ public: template<typename T> T operator() (T t1, T t2) { cout<<t1<<'+'<<t2<<'='<<t1+t2<<endl; return t1; } }; template <typename T> T addFuncT(T t1, T t2, FuncT& funct) { funct(t1,t2); return t1; } FuncT funct; addFuncT(2,4,funct); addFuncT(1.4,2.3,funct); 複製程式碼
大名鼎鼎的STL中便廣泛的運用了這項技術,詳細內容可參見候捷大師的一些泛型技術的書籍,不要以為函式物件的頻繁呼叫會使程式效能大大折扣,大量事實和實驗證明,正確使用函式物件的程式要比其他程式效能快很多!所以掌握並熟練運用函式物件才能為我們的程式加分,否則.......
如此看來,函式物件又為C++敞開了一道天窗,但隨之而來的便是一些複雜的問題和陷阱,如何去蔽揚利還需要我們不斷學習和探索。

相關推薦

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

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

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

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

c++使用指標呼叫函式使用指標呼叫類物件的()過載函式

使用函式指標時,指標可以像函式名一樣,直接加括號和引數列表呼叫;也可先解引用再呼叫 //include directories... using namespace std; void testFun() { cout<<"this is

C++函式指標函式物件

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

C++預設引數函式過載

預設引數概念:        預設引數是宣告或定義函式時為函式的引數指定一個預設值,在呼叫該函式時,如果沒有指定實參則採用該預設值,否則使用指定的實參。 舉例說明: #include<malloc

C全域性變數函式宣告的認識

在C中可以定義全域性變數,全域性變數是在程式載入初始化時分配空間並進行初始化。在c程式碼中定義/宣告全域性變數的方式如下 1. int n;     定義或者宣告(如果在其他檔案中已定義)全域性變數。 2. int n = 10;     定義全域性變數並初始化。 3.

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

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

函式指標函式物件詳解

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

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

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

C++,類函式分開定義宣告實現的方法

test.hpp #include <map> #include <queue> #include <string> #include <vector&g

函式指標 函式物件

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

函式指標函式物件的比較

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

c++,運算子函式有什麼區別?

首先看下運算子的定義: 函式型別 operator 運算子(形參表)  {    函式體; {  譬如++運算子的過載為: class lei{ friend lei operator++(const lei& ); } 呼叫的時候

C++的巨集函式名稱的衝突 STL+windows.h

最近在寫程式碼的時候總是發現在#include"windows.h"了以後經常用STL中的min.max函數出現編譯錯誤。但是自認為程式碼是沒有錯誤的。下面就是相關的程式碼: // testMacro.cpp : Defines the entry point for th

函式指標函式指標型別

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

c++ 指標引用

首先: 指標是儲存的變數的地址,引用是變數的別名,這個必須記住 單純的給變數取別名沒有任何的意義,作為引數傳遞,能保證引數傳遞過程中不產生任何的副本 引用可以直接操作變數,但指標的話必須通過(*p)間接的操作變數,指標可讀性行比較低 //引用必須要有初始值 //

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

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

C/C++字元指標字元陣列、字元指標陣列及指向指標指標的含義

字元指標和字元陣列 char* s1="hello"; char  s2[]="world";兩個表示式的含義是一樣的.如果講不同之處的話,VC6中編譯時,對這兩種定義進行了不同的處理;char *s1 = "hello"; 中的"hello",編譯時指標指向的區域位於PE

C++常量指標指標常量的區別

一、常量指標 常量指標本質是指標,常量修飾它,表示這個指標是一個指向常量的指標(變數),也就是指向一個無法修改的量。 C++中常量指標定義為:const int* a,當然int const * a也可以,不過習慣用第一種了。 使用常量指標時要注意,指標指向的物件不能通

c/c++函式指標指標函式

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