C 函式指標與C 委託之間有何聯絡

2021-09-08 23:04:54 字數 1705 閱讀 1321

c#中有一種應用方法叫做委託。其應用方式及實現功能和我們以前為大家介紹的c++函式指標有不少相同之處。在這篇文章中,我們將會針對這兩種方法做乙個簡單的介紹,方便大家區分理解。

委託和函式指標都描述了方法/函式的簽名,並通過統一的介面呼叫不同的實現。但二者又有明顯的區別,簡單說來,委託物件是真正的物件,而函式指標變數只是函式的入口位址。對於高層應用來講,委託的靈活性和適用範圍更勝c++函式指標;但對於底層應用,函式指標則是不可替代的。下面分別是委託型別和函式指標型別定義的例子:

delegate int fn(int a, int b) //c#委託  

typedef int (*fn)(int a, int b) //c++函式指標 

從形式上看,二者的引數列表和返回值都是相同的,只是乙個採用關鍵字delegate,乙個採用指標符號*。似乎「相似」的說法更有把握了,但如果馬上給二者劃等號就操之過急了。我們先實際驗證一下,看看到底有什麼不同:

//c#  

delegate int fn(int a, int b) ;  

class adder  

public adder(int c)  

}  class multiplier  

public multiplier(int c)  

}  adder adder = new adder(1);  

multiplier multiplier = new multiplier(2);  

fn fn = adder.add;  

fn(1, 2); //結果為4  

fn = multiplier.multiple;  

fn(2, 3); //結果為12 

從上面的**說明了兩個問題:

1.委託物件可以指向不同類的方法,只要符合委託簽名;

2.委託物件是有狀態的(儲存在指向的物件中),委託的行為不僅受到輸入引數的影響,還受到目標物件狀態的影響。

//c++  

typedef int(*fn)(int a, int b);   

int add(int a, int b) ;   

int multiple(int a, int b) ;   

class adder    

int add(int a, int b)    

private:   

int c;   

};   

typedef int(adder::* fm)(int a, int b);   

int _tmain(int argc, _tchar* ar**)   

c#中的委託是一種支援()操作符的特殊物件。這和c/c++函式指標是有本質區別的,因為c/c++的函式指標變數並不具有物件性質,它只是單純的函式入口位址。上面的fn只能指向add和multiple兩個普通函式,無法指向adder類的add方法。因為adder類的add方法的簽名並非int(*)(int a, int b),編譯器會自動加上乙個隱式的this指標引數,所以它的簽名是類似int(*)(adder *const this, int a, int b) 的。

如果需要指向成員函式的指標,需要用typedef int(adder::* fm)(int a, int b)這樣的形式加上型別限定符。所以,c++函式指標不能像c#委託一樣指向不同類的方法;不具有物件的狀態性質;在使用上函式指標也不如委託靈活。所以,當聽到「委託就是類似c/c++函式指標」的說法的時候應該既理解其相似之處,又明了其差別。

C 委託 C函式指標

c 高階程式設計 裡說 net已委託的形式實現了函式指標的概念 這裡簡單比較一下兩者的區別 1 首先看看c下的 函式指標 如何宣告和定義乙個函式變數 typedef int func int x,int y 宣告 func func 定義乙個 函式變數 當已經有這樣乙個實現的函式時 int some...

C 智慧型指標與記憶體洩漏之間的聯絡

在c 中解決記憶體洩漏的有效方法是使用智慧型指標 smart pointer 智慧型指標和普通指標的用法類似,只是不需要手動釋放記憶體,而是通過智慧型指標自己管理記憶體釋放。智慧型指標是儲存指向動態分配 堆 物件指標的類,用於生存期控制,能夠確保在離開指標所在作用域時,自動正確的銷毀動態分配的物件,...

函式的引數可以是陣列嗎 指標和陣列有何聯絡及區別?

1.指標和陣列定義 區別 1.1指標和陣列定義 指標和陣列都是c語言的精髓所在,對於很多c程式設計師來說,如果你問這樣乙個問題 陣列和指標有什麼區別?他們的答案很可能是 陣列和指標不是同一樣東西嗎,他們之間有什麼區別啊?確實在極個別的情況下,陣列和指標確實可以 通用 但是在卻大多數情況下,陣列和指標...