函式模板的簡單知識

2021-10-07 10:01:17 字數 2917 閱讀 6509

交換兩個變數的方法有巨集定義和函式,他們有各自的優缺點:

(1)巨集定義

優:**重複,適合所有型別

缺:缺少型別檢查,巨集在預處理階段就被換,編譯器不知道,用巨集不安全。

(2)函式:

優:真正的函式呼叫,編譯器會對型別檢查,相較於巨集安全。

缺:不同型別需要重複定義函式,**無法復用。

針對以上,c++存在泛型程式設計,不用考慮具體資料型別。

函式模板的編譯

1.定義點

模板的頭部

2.呼叫點

模板的例項化後的模板函式

<>模板型別引數列表

t型別 萬能的型別 虛假的型別

template

t sum(t a, t b)

int main()

函式模板

1)模板的例項化:呼叫點用具體的型別去替換虛假型別的過程。

2)模板函式:

a定義點編譯模板頭部

b呼叫編譯模板函式

3)模板的實參推演:

呼叫點沒有給出的情況下,由系統通過實參推演出來我麼需要的型別。

1.函式模板

函式模板是泛型程式設計在c++中的應用方式之一,是根據實參對引數型別進行推導的,可顯示指定引數型別

2.模板函式

3.模板的例項化

4.模板的實參演繹

5.模板的特例化

1)完全特例化,是全特例化,有函式模板和類模板

2)部分特例化,是偏特例化,有類模板

注意模板過載

6.模板的型別引數

7.模板的非型別引數

1)常量

2)浮點型和類型別

8.接收不明確型別的返回值

9.模板的預設值

10.模板的過載

1)普通函式版本

2)模板函式

3)模板特例化版本

我們在編寫程式時,編譯器會優先去呼叫普通函式,但是當函式模板有更好的匹配時或使用限定符<>時,編譯器就會去匹配函式模板。以上編譯器呼叫順序是:

1)>3) >2)

11.模板的顯示例項化

c++中,函式模板的宣告與定義一般寫在標頭檔案中,若分開寫函式類中宣告與定義,如.h 和.cpp中乙個宣告了某個成員函式乙個定義某個函式,互惠導致連線錯誤,故一般寫在.h裡。

模板的顯示例項化

template int sum(int, int);

template double sum(double, double);

/*int sum(int a, int b)

*/模板函式

bool compare(int a, int b)

int main()

template < typename >

t* getdata()

int main()

實參推演的注意事項

1.不能產生二義性

2.有實參推演依據

<> 模板型別引數列表 ,typename來定義,compare是模板名

一趟呼叫過程中,

乙個模板型別引數只能用乙個型別來替換

1.編譯模板頭部

兩個形參需要相同的型別

2.呼叫點

沒有給出用來例項化的型別

實參推演

5.模板型別引數

typename | class定義

<>模板型別引數列表中處理機制一模一樣

早期 我們使用class定義模板型別引數

後期 我們使用typename定義模板型別引數

template < typename>

class node//node不是類,是模板名稱 nude<>

private:

t mdata;

node< t >* pnext;

}編寫乙個程式,實現乙個排序函式 ,要求任意型別的資料都能用來排序 。**如下:

template

void sort(t arr)}}

}int main()

;sort(arr);

return 0;

}template//class t//類名 類型別

void sort(t arr, int len)}}

}template

void show(t arr, int len)

std::cout << std::endl;

}int main()

;int len = sizeof(arr) / sizeof(arr[0]);

sort(arr, len);//int*

show(arr, len);

return 0;

}

類模板 建議

除了構造和析構以外

其他地方都加上模板型別引數

編寫乙個程式:

使用類模板實現乙個棧 ,如下:

const int stack_size = 10;

template

class stack

void push(t val)

arr[mtop++] = val;

}bool empty()

void pop()

mtop–;

}t top()

return arr[mtop - 1];

}private:

bool full()

t arr[stack_size];

int mtop;

};int main()

auto rt = st.top();

st.pop();

std::cout << "rt : " << rt << std::endl;

return 0;

}

函式模板與類模板的簡單例項

模板分類 class 和 typename的意思是一樣一樣的 1 函式模板 template 型別名 函式名 引數1,2 類模板 include using namespace std templateclass list 函式模板 templatetype2 max type1 a,type2 b...

模板 函式模板

c 程式設計 資料結構與程式設計方法 例15.8 利用函式過載技術,求兩個整數 字元 浮點數或字串中的較大值,需要編寫4個函式larger。而c 通過提供函式模板,簡化了過載函式據的過程。include using namespace std template type,模板的形參,用於確定函式的形...

C 函式模板基礎知識

為什麼要引入模板 為了避免 重複,程式設計師可以編寫脫離資料型別通用模板。模板的分類 函式模板 類模板 注意 模板的宣告或定義只能在全域性,命名空間或類範圍內進行。不能在函式內進行,比如不能在main函式中宣告或定義乙個模板。函式模板 定義 模板函式 重點在函式,是對函式模板進行引數例項化後的結果,...