【C++進階筆記】(1)函式模板的宣告及使用
【C++進階】(1)函式模板的宣告及使用
最近在搞FFmpeg 音視訊開發,後面大量涉及音視訊圖形等介面開發(比如視訊播放器),
利用C語言也可以實現 ,但相對麻煩,在這方面C++會方便很多,記得上一次學C++還是在大二的時候了,
剛好也算趁著這一次機會,把C++ 的知識全部重新撿起來鞏固一遍,
也算逼自已一把,實現由C轉C++,後面寫程式碼、寫演算法就全使用C++ 來實現了。
有關C++ 的學習,打算專門花兩天時間全部過一遍,因為有基礎,所以我學習時都是跳著學,這樣快些
參考視訊教程:《C++教程從0到1入門程式設計》
-
第一天 10月4號
將C++基礎全部過了一遍 (物件導向),
包括C++中的資料型別、陣列、指標、類和物件等,和C大同小異,這裡就不多說了。 -
第二天 10月5號
將C++更高階一些程式設計過一遍(泛型程式設計思想),這些功能很多都是C中沒有的,用起來確實會很方便。
好了,前言就到這裡吧,我們開始學習。
一、函式模板 template < class T>
有關知識點 ,我全部以註釋的形式寫在程式碼中,結合程式碼方便理解運用
1. 簡單的函式模板示例
-
函式模板宣告:
template <typename T>
,T 是一個通用資料型別,將資料型別引數化,利高程式碼的複用性
typename
也可以寫成template<class T>
,沒什麼差別 -
函式模板使用有兩種方法:
(1)方法一:利用編譯器自動推導(必須推匯出一致的資料型別 T 才可以使用)
(2)方法二:顯示指定型別 T,在顯示指定型別後,轉參如果不是當前型別,則會自動發生隱式型別轉換。
示例如下:
#include <iostream>
using namespace std;
// 宣告一個函式模板,告訴編譯器後面程式碼中緊跟著的T不要的報錯
// T 是一個通用資料型別,將資料型別引數化,利高程式碼的複用性
template<typename T>
// 交換兩個資料,資料型別為 T,資料傳遞方式為引用
void Swap(T &a, T &b){
T temp = a;
a = b;
b = temp;
}
int main(){
int a = 10, b = 20;
cout << "初始值: a = " << a << " b = " << b << endl;
// 利用函式模板交換資料
// 方法一:利用編譯器自動推導
cout << "方法一、利用編譯器自動推導 T 的資料型別" << endl;
Swap(a, b);
cout << "交換後: a = " << a << " b = " << b << endl << endl;
// 方法二:顯示指定型別 T
cout << "方法二 、顯示指定型別 T" << endl;
Swap<int>(a, b); // 指定T 的資料型別為 T
cout << "交換後: a = " << a << " b = " << b << endl;
system("pause");
return 0;
}
2. 實現通用資料型別排序演算法示例
#include <iostream>
using namespace std;
// 實現通用的對陣列從小到大排序的函式
template <class T>
void Sort_array(T arr[], int len)
{
// 選擇排序
for (int i = 0; i < len; i++){ // 外迴圈
int max = i;
for (int j = i + 1; j < len; j++) // 內迴圈
{
if (arr[max] > arr[j]) { // 比較出最小值索引
max = j;
}
}
if (max != i) { // 交換元素
T temp = arr[i];
arr[i] = arr[max];
arr[max] = temp;
}
}
}
template<class T>
void print_array(T arr[], int len){
for (int i = 0; i < len; i++){
cout << arr[i] << " ";
}
cout << endl << endl;
}
int main()
{
{
char c_arr[] = "zyxwvutsrqponmlkjihgfedcba";
int num = sizeof(c_arr) / sizeof(char) - 1;
// 對陣列進行從小到大排序
Sort_array(c_arr, num);
print_array(c_arr, num); // 列印陣列
}
{
float f_arr[] = { 10.1,9.1,8.1,7.1,6.1,5.1,4.1,3.1,2.1,1.1 };
int num = sizeof(f_arr) / sizeof(float);
// 對陣列進行從小到大排序
Sort_array(f_arr, num);
print_array(f_arr, num); // 列印陣列
}
system("pause");
return 0;
}
3. 能過空模板引數列表 強制呼叫模板函式
當普通函式,與 模板函式重名時,如果要強制呼叫模板函式,需要使用增加空模板引數列表來實現:Sort_array<>(c_arr, num);
程式碼示例如下,
如果不使用Sort_array<>(c_arr, num);
來呼叫,
預設會呼叫普通函式Sort_array
,從而報程式錯誤(函式未實現),
使用空模板引數列表後,正常執行,呼叫的是模板函式。
#include <iostream>
using namespace std;
void Sort_array(char arr[], int len);
// 實現通用的對陣列從小到大排序的函式
template <class T>
void Sort_array(T arr[], int len)
{
// 選擇排序
for (int i = 0; i < len; i++) // 外迴圈
{
int max = i;
for (int j = i + 1; j < len; j++) // 內迴圈
{
if (arr[max] > arr[j]) { // 比較出最小值索引
max = j;
}
}
if (max != i) { // 交換元素
T temp = arr[i];
arr[i] = arr[max];
arr[max] = temp;
}
}
}
template<class T>
void print_array(T arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl << endl;
}
int main()
{
{
char c_arr[] = "zyxwvutsrqponmlkjihgfedcba";
int num = sizeof(c_arr) / sizeof(char) - 1;
// 對陣列進行從小到大排序
Sort_array<>(c_arr, num);
print_array(c_arr, num); // 列印陣列
}
{
float f_arr[] = { 10.1,9.1,8.1,7.1,6.1,5.1,4.1,3.1,2.1,1.1 };
int num = sizeof(f_arr) / sizeof(float);
// 對陣列進行從小到大排序
Sort_array<>(f_arr, num);
print_array(f_arr, num); // 列印陣列
}
system("pause");
return 0;
}
4. 模板函式 也可 以實現函式過載
示例如下:
template <class T>
void fun(T &a, T &b ){ XXX; }
template <class T>
void fun(T &a, T &b , T &c){ XXX; }
template <class T>
void fun(T &a, T &b , T &c, int d){ XXX; }
相關文章
- JavaScript進階系列01,函式的宣告,函式引數,函式閉包JavaScript函式
- C++類將函式模板宣告為友元 例項C++函式
- C++筆記--函式C++筆記函式
- c++函式模板C++函式
- C++的函式和模板函式 (轉)C++函式
- Effective c++(筆記) 之 類與函式的設計宣告中常遇到的問題C++筆記函式
- C++ 解引用與函式基礎:記憶體地址、呼叫方法及宣告C++函式記憶體
- c++進階(二)函式呼叫約定及函式名稱修飾符C++函式
- 函式的進階函式
- Matlab學習筆記(1)——imshow函式的使用Matlab筆記函式
- C++學習筆記(二)——函式C++筆記函式
- Python 函式進階-高階函式Python函式
- [swift 進階]讀書筆記-第六章:函式 C6P1函式的靈活性(The flexibility of function)Swift筆記函式FlexFunction
- 何時使用函式表示式與函式宣告函式
- Swift學習筆記(二十九)——函式的使用1Swift筆記函式
- C++函式中那些不可以被宣告為虛擬函式的函式C++函式
- 測開之函式進階· 第1篇《遞迴函式》函式遞迴
- 詳解C/C++函式指標宣告C++函式指標
- C++分割字串,及strtok函式使用C++字串函式
- C++ 函式過載,函式模板和函式模板過載,選擇哪一個?C++函式
- C++ 函式過載和模板C++函式
- JS進階(1) —— 人人都能懂的建構函式JS函式
- C++模板的定製一:定製函式模板 (轉)C++函式
- c++學習筆記 -- 建構函式C++筆記函式
- 【進階 6-1 期】JavaScript 高階函式淺析JavaScript函式
- 【c++】函式模板的簡單應用C++函式
- 關於C++當中的“模板函式”C++函式
- 進階筆記筆記
- Python函式的進階Python函式
- day 10 函式的進階函式
- 《Effective C++》第4章 設計與宣告(1)-讀書筆記C++筆記
- 一種將函式模板定義和宣告分開的方法函式
- python學習筆記:第10天 函式進階和作用域Python筆記函式
- C++筆記— 排序函式sort() 和vector容器C++筆記排序函式
- [C++] 氣泡排序的模板函式設計C++排序函式
- c++中模板類的成員函式的宣告與定義應該放在標頭檔案裡C++函式
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式