網站首頁 編程語言 正文
泛類編程
學習模板,首先我們需要了解一下什么是泛類編程
#include<iostream>
using namespace std;
int add(int a, int b)
{
return a + b;
}
double add(double a, double b) //這兩個add構成了函數重載
{
return a + b;
}
int main()
{
int a = 1;
int b = 2;
double c = 3;
double d = 4;
cout << add(a, b) << endl;
cout << add(c, d) << endl;
//假如我們想要實現不同類型變量的相加,可以創建不同的函數,構成函數重載來分別調用不同的函數
return 0;
}
我們可以使用c++的函數重載來解決這個問題,但是函數重載本身就存在問題
1、函數重載僅僅類型不同,假如出現了新的類型,我們就需要重新寫新的函數重載,代碼的利用率低
2、代碼可維護性低,一個出錯可能會導致所有函數重載出錯
泛型編程:編寫與類型無關的通用代碼,是代碼復用的一種手段
所以c++提供了一種模板來解決這個問題
模板本質上:本來應該由你寫的代碼,然后不想重復寫,你給了一個模板,編譯器通過模板,幫你生成了對應的代碼
函數模板
函數模板的概念
函數模板代表了一個函數家族,該函數模板與實參無關,當函數被使用時候會被實參初始化,從而產生不同的函數類型
函數模板的使用
函數模板的格式:
template<typename T1, typename T2, ......, typename Tn> //函數模板的參數不止一個,可以有很多參數
//返回值類型 函數名(參數列表) {}
函數模板的使用:?
template<typename T> //也可以用<class T>,效果和<typename T>一樣,但是不能用struct
T add(T x, T y)
{
return x + y;
}
注意:typename是函數模板的關鍵字,也可以使用class,但是不能使用struct
函數模板的實例化
當我們用不同的參數使用函數模板時,就稱為函數模板的初始化
函數模板的實例化有兩種:
1、隱式實例化(讓編譯器根據實參推演模板參數的實際類型)
#include<iostream>
using namespace std;
template<typename T>
T add(T x, T y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
double c = 3, d = 4;
cout << add(a, b) << endl; //使用了隱式實例化,由編譯器自動推演實例化參數類型
return 0;
}
2. 顯式實例化(在函數名后的<>中指定模板參數的實際類型)
#include<iostream>
using namespace std;
template<typename T>
T add(T x, T y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
double c = 3, d = 4;
cout << add<int>(a, c) << endl;
//由于a和c的類型不同,所以我們必須使用顯示實例化,即函數名后面<type>括號中加上你想要實例化的類型
return 0;
}
函數模板的匹配原則
1、模板模板可以和一個同名非函數模板同時存在?
2、假如模板函數和非模板函數同名,編譯器會選擇一個更匹配的類型進行使用
#include<iostream>
using namespace std;
int add(int x, int y)
{
return x + y;
}
template<typename T>
T add(T x, T y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
double c = 3, d = 4;
cout << add(a, b) << endl; //因為a,b是整型,所以會調用非函數模板,因為有都是整型參數的非函數模板
return 0;
}
3、模板函數不允許自動類型轉換,但普通函數可以進行自動類型轉換
#include<iostream>
using namespace std;
template<typename T>
T add(T x, T y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
double c = 3, d = 4;
cout << add(a, (int)c) << endl;
return 0;
}
假如我們要使用函數模板的add,需顯示實例化add,或者將c強制類型轉換,函數模板不會自動轉換,因為他不知道要如何轉換的
類模板
類模板的定義格式
類模板的定義格式:
template<class T1, class T2, ..., class Tn>
class 類模板名
{
// 類內成員定義
};
template<class T> //創建類模板
class Date
{
public:
void init();
private:
int _year;
};
template<class T> //假如我們需要在類模板的類外面定義函數,需要添加模板列表
Date<int>init() //還需要在類名后面<>中添加模板參數列表
{
_year = 0;
}
類模板的實例化
//Date是類名,Date<int>是類型
Date<int> d; //類模板的實例化需要在類模板名的后面<>中添加想要實例化的類型
原文鏈接:https://blog.csdn.net/qq_45358642/article/details/124203685
相關推薦
- 2022-04-25 ASP.NET?Core?MVC中Tag?Helpers用法介紹_實用技巧
- 2022-05-11 批量導入模板數據的時候遇到的一些關于多線程的問題
- 2022-05-31 Windows下搭建Redis集群的方法步驟_Redis
- 2022-01-30 Unknown custom element: <router-view> - did you re
- 2022-10-01 如何使用draw.io插件在vscode中一體化導出高質量圖片_python
- 2022-10-13 Android自定義View實現QQ消息氣泡_Android
- 2022-05-26 Python借助with語句實現代碼段只執行有限次_python
- 2022-09-17 利用Python提取PDF文本的簡單方法實例_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支