模板函式的詳情介紹

2021-12-30 03:30:03 字數 4232 閱讀 9251

0.如何編寫乙個高效的加法函式?

1.什麼是模板函式?

2.模板函式怎麼寫?

3.模板如何進行例項化? 隱式例項化? 顯式例項化?

4.什麼是引數推演?

5.模板函式如何編譯?

6.模板函式的模板引數列表? 型別引數? 非型別引數?

7.模板函式的過載?

8.什麼是模板的特化?

0.如何編寫乙個高效的加法函式?

學完c語言,若要寫乙個整型的加法函式, 那麼,寫出如下**可謂小輕鬆:

int add(const int& left,const int& right)

如上是乙個計算整型的加法函式,那麼若要計算實型資料的加法,如add(1.0,2.0),或者字元型加法add(「1」,「2」)時,顯然,以上的add函式就不能滿足計算,那麼該怎麼辦呢?

當學完c++ ,我們知道,實現該問題,可以使用如下四種方法:

a–函式過載

b–巨集函式替換

c–使用公共基類

d–泛型程式設計

前三種方法都有各自的優缺點,那麼下面就來具體的談一談:

a:使用函式過載優點和缺點:

1.優點:

1.1 函式過載易於理解, 可讀性高

1.2.呼叫哪個函式按其實參型別匹配相應的函式即可。

1.3.可以除錯程式,進行型別的檢測

2.缺點:

2.1. 只要有新型別的出現,就需要新增與之對應型別的函式

2.2. 函式只有型別不同,函式體均相同,從而使得**復用率不高

2.3. 乙個方法如果有問題,所有的方法都將有問題,不好維護

b:

1.優點:

使用巨集函式替換:簡潔,方便

2.缺點:

2.1. 不能除錯程式,容易出錯

2.2. 巨集定義不是函式,不進行型別的檢測,安全性不高

c:使用公共基類的缺點:

借助公共基類來編寫通用**,將失去型別檢測的優點 對於以後要實現的許多類,都必須繼承特定的基類,**維護更加的困難

為了解決上述的問題,以及解決方案的缺點,繼承其優點,c++採用泛型程式設計

d:泛型程式設計:

概念:泛型程式設計是編寫與型別無關的邏輯**,是實現**復用的一種手段,其中模板是泛型程式設計的基礎,以下具體來看:

1.模板函式概念

1.模板:模板包含函式模板和類模板;

2.函式模板:代表了乙個函式家族,該函式與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。

2.模板函式書寫

1.函式模板的格式

template

返回值型別 函式名(引數列表)

2.說明:typename是定義模板函式的關鍵字,在這裡也可以使用class,不可使用struct,為了便於區分,建議盡量使用typename,使用class容易與c++中的類混淆。

3.在c++中struct和class的區別:

1. 在定義類時,兩者均可使用,但是,struct預設的訪問許可權為public,class的預設訪問許可權是private ;

2. class可以做模板函式的關鍵字定義函式模板,而struct不可以。

4.函式模板其他知識:

a: inline:

模板函式可以定義為inline函式,inline關鍵字必須放在模板的形參列表後,函式返回值之前。

template

inline t add(t left,t right)

b.函式模板只適用於函式引數個數相同而型別不同,且函式體相同的情況,若引數個數不同,則不能用模板函式

3.模板例項化

!**執行過程中,模板被編譯了兩次 !

1.例項化之前,檢查模板**本身,檢視是否出現語法錯誤;(模板缺少分號不能被檢測出)

2.例項化期間,檢查模板**,檢視是否所有呼叫都有效

3.模板例項化:產生模板特定型別的過程 ,分為隱式例項化和 顯式例項化,

4.引數推演

模板實參推演:根據函式實參型別來決定模板實參的型別和值得過程,若是多個型別的形參,也要與實參型別完全匹配;

5.模板函式編譯

編譯器會執行的兩種轉化:

**511.**const 轉化,接受const引用或則指標的函式可以分別用非const物件的引用或則指標來呼叫

template

const t& add(const t& left,const t& right)

int main()

6.模板函式的模板引數列表1.函式模板有兩種型別的引數:模板型別引數和模板非型別引數

2.模板形參名字只能在模板形參列表之後到模板宣告或定義的末尾之間使用;

3.遵循名字遮蔽規則,如果在函式模板之外申明了與模板引數名同名的物件、函式或型別,則該全域性變數將被隱藏;巨集定義的型別名與模板型別名相同,在模板作用域內也將被遮蔽

如下所示:

typedef int t;

template

void funtest(t t)

template

t max(const t& left,const t& right)

template

t max(const t& a,const t& b,const t& c)

int main()

2.特別說明:

1.乙個非模板函式可和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式;

2.對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生乙個例項,如果模板可以產生乙個具有更好匹配的函式,那麼將選擇模板 ;

3.顯示指定乙個空的模板實參列表,該語法告訴編譯器只有模板才能匹配這個呼叫.而且所有的模板引數都應該根據實參演繹而來

4.模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換

5.比較字串的大小時:

char *p1 = "hello";

char *p2 = "world";

printf("%s\n",max(p1,p2));

由肉眼可得,應該返回的是 world ,但是,和預想的結果恰恰相反,針對這類情況,我們有函式模板的例項化

template<>

返回值 函式名(引數列表)

8.模板的特化對於以上字串比較hello, world的例子,這裡採用函式模板特化解決,**如下:

根據函式模板寫函式模板特化:

template

t max(const t& left,const t& right) //const修飾的是left(位址,不能改變指向),而值可以發生改變

return right;

}template<>

char* max( char* const &left, char* const &right)

return right;

}int main()

{ char* p1 = "hello";

char* p2 = "world";

cout執行結果:

注意:const修飾變數時,const修飾t& left時,指向不能改變,值可改變,與const修飾int *a正好相反。

C 函式過載詳情介紹

函式過載還有乙個別名叫函式多型,其實我個人感覺函式多型這個名字更好理解更恰當一些。函式多型是c 在c語言基礎上的新特性,它可以讓我們程式設計客棧使用多個同名函式。當然這些同名函式的引數是要有區別的,我們在函式呼叫的時候,編譯器會自動根據我們傳入的引數,從多個同名函式當中找到我們呼叫的那乙個。和物件導...

CharSequence 詳情介紹

前言 charsequence是乙個介面,比較常見的string stringbuilder stringbuffer都實現了這個介面。當我們看到乙個api裡面有charsequence的時候,它也是可以被其子類代替的,一般用string代替即可。charsequence詳情介紹 charseque...

Scrum詳情介紹

瀑布式開發模式 制定計畫 需求分析 軟體設計 程式編寫 軟體測試 執行維護 傳統的瀑布式開發有以下缺點 1,階段劃分固定,產生大量文件,增加工作量 2,開發模式線性,使得客戶只能在最後看到開發成果,增加開發風險 3,不適應使用者需求變化 由此,出現了敏捷開發,代替傳統的瀑布式開發,解決瀑布式開發的缺...