小甲魚 C 快速入門筆記 44 之函式模板

2021-10-19 08:27:16 字數 1117 閱讀 4334

www.fishc.com

兩種c++程式設計范型:

(1)按照面向過程式范型把程式劃分為不同的函式

(2)按照物件導向式范型把**和資料組織成各種各樣的類並建立類之間的繼承關係.

(3)泛型程式設計:支援程式設計師建立函式和類的藍圖(即模板,template),而不是具體的函式和類

當程式需要用到這些函式中的某乙個時,編譯器將根據模板即時生成乙個能夠對特定資料型別進行處理的**版本.在泛型程式設計技術裡,我們仍然要編寫自己的函式和類,但不必限定它們所使用的資料型別.只需要使用乙個佔位符(通常用字母t來表示),然後用這個佔位符來編寫函式.當程式需要這段**時,你提供資料型別,編譯器將根據你的模板即時生成實用的**.

基本的模板語法:

template void foo(t param)

注意: 在尖括號裡有乙個class t,用來告訴編譯器:字母t將在接下來的函式裡代表一種不確定的資料型別.

舉個栗子:

變換兩個變數的值:

比如我們編寫乙個swap的函式,輸入的資料是int型,但是如果現在要輸入double的引數該怎麼辦,第乙個想到的是用函式過載,增加乙個swap(double &a, double &b)函式,但是如果有多重輸入的型別呢?這就會帶來乙個問題:需要反覆編寫同樣的**.

這裡就需要採用函式模板來解決這個問題.因此當你再使用swap()函式時,編譯器將根據模板自動建立乙個函式,該函式會使用正確的資料型別完成交換變數值的任務.

舉個栗子:

#include #include using namespace std;

template void swap(t &a, t &b)

int main()

上述**編譯不通過,後來在qt上也編譯不通過.

提示的錯誤: call of overloaded 'swap(t &a, t &b)' is ambiguous

發現是自己偷懶造成的, 一直以來都是使用using namespace std; 結果今天就出問題了,原因是標準庫的命名空間std中也有乙個swap()函式,所以才會導致二義性.於是把所有的std都換一下,編譯通過.

參考: 

小甲魚 C 快速入門筆記 6 之函式的過載

定義 用同樣的名字再定義乙個有著不同引數但有著同樣用途的函式,可以是引數個數上的不同,也可以是引數資料型別上的不同 include using namespace std void converttemperature double tempin,char typein void convertte...

小甲魚 C 快速入門筆記 19 之訪問控制

在此前的例子中,我們無論是animal,pig和turtle類的所有成員都是用public 語句宣告。注意 1 一定要記住使用這些訪問級別,即使只有你乙個人再開發某個專案,全部記住各個類的呼叫方法也是一件困難的事情 2 給每個方法和屬性加上protected或private訪問級別,就由編譯器替你記...

小甲魚 C 快速入門筆記 49 之迭代器

引言 上節課我們的例子雖然工作得很好並也使用了乙個標準的容器 向量容器 但它還是有個小問題,就是在遍歷向量裡的各個元素時,我們仍把它視為乙個c 陣列來對待.剛好我們的向量容器允許使用下標操作符來訪問它的各個元素 name x 因為對容器裡的各個元素進行遍歷是一種十分常見的任務,所以應該有一種標準的方...