一、函數(shù)模板與普通函數(shù)區(qū)別
1、函數(shù)模板與普通函數(shù)區(qū)別
函數(shù)模板與普通函數(shù)區(qū)別 : 主要區(qū)別在于它們能夠處理的 數(shù)據(jù)類型數(shù)量 和 靈活性 ;
-
自動類型轉換 :
- 函數(shù)模板 不允許 自動類型轉化 , 會進行嚴格的類型匹配 ;
- 普通函數(shù) 能夠進行 自動類型轉換 , 內(nèi)含隱式的類型轉化 ;
-
參數(shù) / 返回值 數(shù)據(jù)類型 :
- 普通函數(shù) 只接受 特定類型 參數(shù) , 如 : int / double / bool / string 等類型 ;
- 函數(shù)模板 可以接受 任何類型 的參數(shù) , 函數(shù)模板在 C++ 編譯器 編譯時 將類型參數(shù)實例化 , 生成對應的 普通函數(shù) ;
-
靈活性 :
- 普通函數(shù) 對于 不同的 數(shù)據(jù)類型參數(shù) 需要單獨定義 ; 例如 : 定義一個加法函數(shù) , 接收參數(shù)類型分別是 int 和 float 類型 , 此時需要定義 2 個不同的函數(shù) ;
- 函數(shù)模板 只需要定義一個函數(shù) , 就可以接收任何數(shù)據(jù)類型的參數(shù) ;
-
語法不同 :
-
普通函數(shù) 直接定義 返回類型 , 函數(shù)名 , 參數(shù)列表 , 函數(shù)體 , 即可 完成函數(shù)定義 , 如 :
int add(int a, int b){}
; -
函數(shù)模板 先使用
template <typename T>
聲明泛型 , 后面跟著 返回類型 , 函數(shù)名 , 參數(shù)列表 , 函數(shù)體 , 等內(nèi)容 , 在 函數(shù)的 參數(shù)列表 返回類型 中可使用 聲明的 泛型類型 , 如 :T add(T a, T b){}
;
-
普通函數(shù) 直接定義 返回類型 , 函數(shù)名 , 參數(shù)列表 , 函數(shù)體 , 即可 完成函數(shù)定義 , 如 :
-
函數(shù)模板實例化 : 使用函數(shù)模板時 , C++ 編譯器會根據(jù) 實際傳入的 參數(shù)類型 自動實例化相應的函數(shù) ; 如 : 定義的
T add(T a, T b)
類型的 函數(shù)模板 , 如果傳入int
類型的參數(shù) , 會自動創(chuàng)建int add(int a, int b)
普通函數(shù) ; -
函數(shù)模板弊端 - 復雜性 / 維護難度高 :
- 復雜性 : 函數(shù)模板 需要為每一種可能的類型生成一個函數(shù)實例 , 所以 如果使用函數(shù)模板處理很多類型 , 需要創(chuàng)建很多普通函數(shù)實例 , 會導致編譯時間增加 , 代碼庫增大 ;
- 維護難度高 : 如果錯誤地使用 函數(shù)模板 可能會導致難以查找的錯誤 , 普通函數(shù) 更簡單、更易于理解和維護。
2、代碼示例 - 函數(shù)模板與普通函數(shù)區(qū)別
在下面的函數(shù)中 , 第一個調(diào)用場景 , 完全符合 普通函數(shù) 的 調(diào)用要求 , 優(yōu)先調(diào)用 普通函數(shù) ;
int a = 10, b = 20;
// 調(diào)用普通函數(shù)
// 如果符合普通函數(shù)要求 優(yōu)先調(diào)用普通函數(shù)
int c = add(a, b);
第二個調(diào)用場景 , 因為使用了 函數(shù)模板 的顯式調(diào)用 , 必須使用 函數(shù)模板 ;
int i = 30, j = 40;
// 調(diào)用函數(shù)模板
// 函數(shù)模板 顯式類型調(diào)用
int k = add<int>(i, j);
第三個調(diào)用場景 , 參數(shù)類型不符合普通函數(shù)調(diào)用 , 符合 函數(shù)模板 的調(diào)用規(guī)則 , 這里使用 函數(shù)模板 ;
double x = 50.0, y = 60.0;
// 調(diào)用函數(shù)模板
// 函數(shù)模板 自動類型推導
double z = add(x, y);
代碼示例 :
#include "iostream"
using namespace std;
// 使用 template 關鍵字 聲明函數(shù)模板
// 告訴 C++ 編譯器 開始使用 泛型編程
// 定義的 T 是泛型類型
// 聲明了多個泛型, 可以只使用其中的部分類型
// 使用函數(shù)模板時 , 顯式類型調(diào)用 必須 顯式指定所有 泛型類型 的實際類型
template <typename T>
T add(T a, T b) {
cout << "調(diào)用函數(shù)模板 T add(T a, T b)"<< endl;
return a + b;
}
// 函數(shù)模板的 重載函數(shù)
// 重載是發(fā)生在 同一個作用域中
// 重寫是發(fā)生在 父類 與 子類 之間
// C++ 編譯器優(yōu)先 調(diào)用 符合要求的 普通函數(shù)
// 如果普通函數(shù)不符合要求 , 則考慮調(diào)用 函數(shù)模板
int add(int a, int b) {
cout << "調(diào)用普通函數(shù) int add(int a, int b)" << endl;
return a + b;
}
// 普通函數(shù) , 函數(shù)模板 調(diào)用 優(yōu)先級
// 函數(shù)模板 會進行 嚴格類型匹配 , 不會進行 類型轉換 ;
//
// 如果 符合 普通函數(shù)類型參數(shù)要求 , 優(yōu)先調(diào)用普通函數(shù) ;
// 如果 沒有 符合要求的 普通函數(shù) , 則查看 模板函數(shù) 能否匹配 ;
// 如果 模板函數(shù) 仍不能匹配 , 則查看 普通函數(shù) 類型轉換能否匹配 ;
int main() {
int a = 10, b = 20;
// 調(diào)用普通函數(shù)
// 如果符合普通函數(shù)要求 優(yōu)先調(diào)用普通函數(shù)
int c = add(a, b);
cout << "c = " << c << endl;
int i = 30, j = 40;
// 調(diào)用函數(shù)模板
// 函數(shù)模板 顯式類型調(diào)用
int k = add<int>(i, j);
cout << "k = " << k << endl;
double x = 50.0, y = 60.0;
// 調(diào)用函數(shù)模板
// 函數(shù)模板 自動類型推導
double z = add(x, y);
cout << "z = " << z << endl;
// 控制臺暫停 , 按任意鍵繼續(xù)向后執(zhí)行
system("pause");
return 0;
}
執(zhí)行結果 :
調(diào)用普通函數(shù) int add(int a, int b)
c = 30
調(diào)用函數(shù)模板 T add(T a, T b)
k = 70
調(diào)用函數(shù)模板 T add(T a, T b)
z = 110
Press any key to continue . . .文章來源:http://www.zghlxwxcb.cn/news/detail-830961.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-830961.html
到了這里,關于【C++】泛型編程 ② ( 函數(shù)模板與普通函數(shù)區(qū)別 )的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!