c++分離講解模板的概念與使用
泛類編程
學(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ù)重載來分別調(diào)用不同的函數(shù) return 0; }
我們可以使用c++的函數(shù)重載來解決這個(gè)問題,但是函數(shù)重載本身就存在問題
1、函數(shù)重載僅僅類型不同,假如出現(xiàn)了新的類型,我們就需要重新寫新的函數(shù)重載,代碼的利用率低
2、代碼可維護(hù)性低,一個(gè)出錯(cuò)可能會(huì)導(dǎo)致所有函數(shù)重載出錯(cuò)
泛型編程:編寫與類型無關(guān)的通用代碼,是代碼復(fù)用的一種手段
所以c++提供了一種模板來解決這個(gè)問題
模板本質(zhì)上:本來應(yīng)該由你寫的代碼,然后不想重復(fù)寫,你給了一個(gè)模板,編譯器通過模板,幫你生成了對(duì)應(yīng)的代碼
函數(shù)模板
函數(shù)模板的概念
函數(shù)模板代表了一個(gè)函數(shù)家族,該函數(shù)模板與實(shí)參無關(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í)例化的類型
到此這篇關(guān)于c++分離講解模板的概念與使用的文章就介紹到這了,更多相關(guān)c++模板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方
這篇文章主要介紹了零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方,文中講解非常細(xì)致,供大家參考和學(xué)習(xí),想要學(xué)習(xí)C/C++的可以閱讀此文2020-06-06C語言詳細(xì)分析講解關(guān)鍵字const與volatile的用法
在C語言中,我們經(jīng)常會(huì)見到const和volatile這兩個(gè)關(guān)鍵字,那么我們今天就來介紹下這兩個(gè)關(guān)鍵字,提起?const?關(guān)鍵字,我們可能首先想到的是經(jīng)過它修飾的變量便是常量了。其實(shí)我們這種想法是錯(cuò)誤的,其實(shí)?const?修飾的變量是只讀的,其本質(zhì)還是變量2022-04-04C++基礎(chǔ)知識(shí)之運(yùn)算符重載詳解
這篇文章主要為大家詳細(xì)介紹了C++基礎(chǔ)知識(shí)之運(yùn)算符重載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02C語言字符函數(shù)中的isalnum()和iscntrl()你都知道嗎
這篇文章主要為大家詳細(xì)介紹了C語言字符函數(shù)中的isalnum()和iscntrl(),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02關(guān)于C++類的成員初始化列表的相關(guān)問題
下面小編就為大家?guī)硪黄P(guān)于C++類的成員初始化列表的相關(guān)問題。小編覺得挺2016-05-05Qt圖形圖像開發(fā)曲線圖表模塊QChart庫基本用法、各個(gè)類之間的關(guān)系說明
這篇文章主要介紹了Qt圖形圖像開發(fā)曲線圖表模塊QChart庫基本用法、各個(gè)類之間的關(guān)系說明,需要的朋友可以參考下2020-03-03C語言 ffmpeg與sdl實(shí)現(xiàn)播放視頻同時(shí)同步時(shí)鐘詳解
使用ffmpeg和sdl實(shí)現(xiàn)播放視頻后,需要再實(shí)現(xiàn)時(shí)鐘同步才能正常的播放視頻,尤其是有音頻的情況,我們通常需要將視頻同步到音頻來確保音畫同步2022-09-09