網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
泛類編程
學(xué)習(xí)模板,首先我們需要了解一下什么是泛類編程
#include<iostream>
using namespace std;
int add(int a, int b)
{
return a + b;
}
double add(double a, double b) //這兩個(gè)add構(gòu)成了函數(shù)重載
{
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;
//假如我們想要實(shí)現(xiàn)不同類型變量的相加,可以創(chuàng)建不同的函數(shù),構(gòu)成函數(shù)重載來(lái)分別調(diào)用不同的函數(shù)
return 0;
}
我們可以使用c++的函數(shù)重載來(lái)解決這個(gè)問(wèn)題,但是函數(shù)重載本身就存在問(wèn)題
1、函數(shù)重載僅僅類型不同,假如出現(xiàn)了新的類型,我們就需要重新寫新的函數(shù)重載,代碼的利用率低
2、代碼可維護(hù)性低,一個(gè)出錯(cuò)可能會(huì)導(dǎo)致所有函數(shù)重載出錯(cuò)
泛型編程:編寫與類型無(wú)關(guān)的通用代碼,是代碼復(fù)用的一種手段
所以c++提供了一種模板來(lái)解決這個(gè)問(wèn)題
模板本質(zhì)上:本來(lái)應(yīng)該由你寫的代碼,然后不想重復(fù)寫,你給了一個(gè)模板,編譯器通過(guò)模板,幫你生成了對(duì)應(yīng)的代碼
函數(shù)模板
函數(shù)模板的概念
函數(shù)模板代表了一個(gè)函數(shù)家族,該函數(shù)模板與實(shí)參無(wú)關(guān),當(dāng)函數(shù)被使用時(shí)候會(huì)被實(shí)參初始化,從而產(chǎn)生不同的函數(shù)類型
函數(shù)模板的使用
函數(shù)模板的格式:
template<typename T1, typename T2, ......, typename Tn> //函數(shù)模板的參數(shù)不止一個(gè),可以有很多參數(shù)
//返回值類型 函數(shù)名(參數(shù)列表) {}
函數(shù)模板的使用:?
template<typename T> //也可以用<class T>,效果和<typename T>一樣,但是不能用struct
T add(T x, T y)
{
return x + y;
}
注意:typename是函數(shù)模板的關(guān)鍵字,也可以使用class,但是不能使用struct
函數(shù)模板的實(shí)例化
當(dāng)我們用不同的參數(shù)使用函數(shù)模板時(shí),就稱為函數(shù)模板的初始化
函數(shù)模板的實(shí)例化有兩種:
1、隱式實(shí)例化(讓編譯器根據(jù)實(shí)參推演模板參數(shù)的實(shí)際類型)
#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; //使用了隱式實(shí)例化,由編譯器自動(dòng)推演實(shí)例化參數(shù)類型
return 0;
}
2. 顯式實(shí)例化(在函數(shù)名后的<>中指定模板參數(shù)的實(shí)際類型)
#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的類型不同,所以我們必須使用顯示實(shí)例化,即函數(shù)名后面<type>括號(hào)中加上你想要實(shí)例化的類型
return 0;
}
函數(shù)模板的匹配原則
1、模板模板可以和一個(gè)同名非函數(shù)模板同時(shí)存在?
2、假如模板函數(shù)和非模板函數(shù)同名,編譯器會(huì)選擇一個(gè)更匹配的類型進(jìn)行使用
#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; //因?yàn)閍,b是整型,所以會(huì)調(diào)用非函數(shù)模板,因?yàn)橛卸际钦蛥?shù)的非函數(shù)模板
return 0;
}
3、模板函數(shù)不允許自動(dòng)類型轉(zhuǎn)換,但普通函數(shù)可以進(jìn)行自動(dòng)類型轉(zhuǎn)換
#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;
}
假如我們要使用函數(shù)模板的add,需顯示實(shí)例化add,或者將c強(qiáng)制類型轉(zhuǎn)換,函數(shù)模板不會(huì)自動(dòng)轉(zhuǎn)換,因?yàn)樗恢酪绾无D(zhuǎn)換的
類模板
類模板的定義格式
類模板的定義格式:
template<class T1, class T2, ..., class Tn>
class 類模板名
{
// 類內(nèi)成員定義
};
template<class T> //創(chuàng)建類模板
class Date
{
public:
void init();
private:
int _year;
};
template<class T> //假如我們需要在類模板的類外面定義函數(shù),需要添加模板列表
Date<int>init() //還需要在類名后面<>中添加模板參數(shù)列表
{
_year = 0;
}
類模板的實(shí)例化
//Date是類名,Date<int>是類型
Date<int> d; //類模板的實(shí)例化需要在類模板名的后面<>中添加想要實(shí)例化的類型
原文鏈接:https://blog.csdn.net/qq_45358642/article/details/124203685
相關(guān)推薦
- 2022-12-26 python?QT界面關(guān)閉線程池的線程跟隨退出完美解決方案_python
- 2022-05-28 C語(yǔ)言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì)_C 語(yǔ)言
- 2023-08-12 JQ 實(shí)現(xiàn)復(fù)制到剪切板
- 2022-06-27 Abp集成HangFire開源.NET任務(wù)調(diào)度框架_實(shí)用技巧
- 2022-02-15 獲取字符串大括號(hào)里面的值 ,并判斷字符串是否符合要求
- 2022-09-16 Pandas缺失值填充?df.fillna()的實(shí)現(xiàn)_python
- 2023-01-07 詳解C++11中綁定器bind的原理與使用_C 語(yǔ)言
- 2023-07-05 uni-app處理請(qǐng)求發(fā)送表單類型的數(shù)據(jù)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支