c++分離講解模板的概念與使用
泛類編程
學(xué)習(xí)模板,首先我們需要了解一下什么是泛類編程
#include<iostream>
using namespace std;
int add(int a, int b)
{
return a + b;
}
double add(double a, double b) //這兩個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;
//假如我們想要實現(xiàn)不同類型變量的相加,可以創(chuàng)建不同的函數(shù),構(gòu)成函數(shù)重載來分別調(diào)用不同的函數(shù)
return 0;
}我們可以使用c++的函數(shù)重載來解決這個問題,但是函數(shù)重載本身就存在問題
1、函數(shù)重載僅僅類型不同,假如出現(xiàn)了新的類型,我們就需要重新寫新的函數(shù)重載,代碼的利用率低
2、代碼可維護(hù)性低,一個出錯可能會導(dǎo)致所有函數(shù)重載出錯
泛型編程:編寫與類型無關(guān)的通用代碼,是代碼復(fù)用的一種手段
所以c++提供了一種模板來解決這個問題
模板本質(zhì)上:本來應(yīng)該由你寫的代碼,然后不想重復(fù)寫,你給了一個模板,編譯器通過模板,幫你生成了對應(yīng)的代碼
函數(shù)模板
函數(shù)模板的概念
函數(shù)模板代表了一個函數(shù)家族,該函數(shù)模板與實參無關(guān),當(dāng)函數(shù)被使用時候會被實參初始化,從而產(chǎn)生不同的函數(shù)類型
函數(shù)模板的使用
函數(shù)模板的格式:
template<typename T1, typename T2, ......, typename Tn> //函數(shù)模板的參數(shù)不止一個,可以有很多參數(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ù)模板的實例化
當(dāng)我們用不同的參數(shù)使用函數(shù)模板時,就稱為函數(shù)模板的初始化
函數(shù)模板的實例化有兩種:
1、隱式實例化(讓編譯器根據(jù)實參推演模板參數(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ù)類型
return 0;
}2. 顯式實例化(在函數(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ù)名后面<type>括號中加上你想要實例化的類型
return 0;
}函數(shù)模板的匹配原則
1、模板模板可以和一個同名非函數(shù)模板同時存在
2、假如模板函數(shù)和非模板函數(shù)同名,編譯器會選擇一個更匹配的類型進(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; //因為a,b是整型,所以會調(diào)用非函數(shù)模板,因為有都是整型參數(shù)的非函數(shù)模板
return 0;
}3、模板函數(shù)不允許自動類型轉(zhuǎn)換,但普通函數(shù)可以進(jìn)行自動類型轉(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,需顯示實例化add,或者將c強(qiáng)制類型轉(zhuǎn)換,函數(shù)模板不會自動轉(zhuǎn)換,因為他不知道要如何轉(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;
}類模板的實例化
//Date是類名,Date<int>是類型 Date<int> d; //類模板的實例化需要在類模板名的后面<>中添加想要實例化的類型
到此這篇關(guān)于c++分離講解模板的概念與使用的文章就介紹到這了,更多相關(guān)c++模板內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ chrono 獲取當(dāng)前時間的實現(xiàn)代碼
這篇文章主要介紹了c++ chrono 獲取當(dāng)前時間的實現(xiàn)代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
Linux下Select多路復(fù)用實現(xiàn)簡易聊天室示例
大家好,本篇文章主要講的是Linux下Select多路復(fù)用實現(xiàn)簡易聊天室示例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
C++實現(xiàn)LeetCode(35.搜索插入位置)
這篇文章主要介紹了C++實現(xiàn)LeetCode(35.搜索插入位置),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

