国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++基礎(chǔ)(十)】C++泛型編程--模板初階

這篇具有很好參考價值的文章主要介紹了【C++基礎(chǔ)(十)】C++泛型編程--模板初階。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??博主CSDN主頁:杭電碼農(nóng)-NEO??
?
?專欄分類:C++從入門到精通?
?
??代碼倉庫:NEO的學(xué)習(xí)日記??
?
??關(guān)注我??帶你學(xué)習(xí)C++
? ????


【C++基礎(chǔ)(十)】C++泛型編程--模板初階,C++從入門到精通,c++,開發(fā)語言

1. 前言

在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時會遇見以下的情況
數(shù)據(jù)結(jié)構(gòu)中存儲的類型往往不能確定
所以在實現(xiàn)數(shù)據(jù)結(jié)構(gòu)時往往是這樣做的

typedef int DateType

在寫代碼時用DateType來表示類型
如果想存儲浮點型只需將int改為float

但是這樣寫會遇見一個問題:
寫好數(shù)據(jù)結(jié)構(gòu)類后在創(chuàng)建對象時
此.cpp文件只能創(chuàng)建一種類型的對象
對象存儲的全是int/char/double類型
不能同時創(chuàng)建存儲int的和char的對象

Data d1;//存儲的int類型
Date d2;//存儲的char類型

泛型編程:
編寫與類型無關(guān)的通用代碼
是代碼復(fù)用的一種手段
模板是泛型編程的基礎(chǔ)

本章重點:

本篇文章重點講解函數(shù)模板
和類模板的使用以及特性


2. 函數(shù)模板

請看以下函數(shù)代碼:

void Swap(int& left, int& right)
{
	 int temp = left;
	 left = right;
	 right = temp;
}
void Swap(double& left, double& right)
{
	 double temp = left;
	 left = right;
	 right = temp;
}
void Swap(char& left, char& right)
{
	 char temp = left;
	 left = right;
	 right = temp;
}

這樣寫非常的麻煩
使用模板可以使代碼通用于不同類型:
swap函數(shù)模板:

template<typename T>
void Swap( T& left, T& right)
{
	T temp = left;
	left = right;
	right = temp;
}

寫好上面的代碼后,傳int類型進去
T就會被實例化為int,以此類推

template和typename是規(guī)定
好了必須這樣寫,T是自己取的名字
其中,typename可以用class替換
并且一次性可以定義多個類型:

template<class T1,typename T2,class T3>

3. 函數(shù)模板原理

函數(shù)模板是一個藍圖,它本身并不是函數(shù),是編譯器用使用方式產(chǎn)生特定具體類型函數(shù)的模具。所以其實模板就是將本來應(yīng)該我們做的重復(fù)的事情交給了編譯器

【C++基礎(chǔ)(十)】C++泛型編程--模板初階,C++從入門到精通,c++,開發(fā)語言

在編譯器編譯階段,對于模板函數(shù)的使用,編譯器需要根據(jù)傳入的實參類型來推演生成對應(yīng)類型的函數(shù)以供調(diào)用。比如:當(dāng)用double類型使用函數(shù)模板時,編譯器通過對實參類型的推演,將T確定為double類型,然后產(chǎn)生一份專門處理double類型的代碼,對于字符類型也是如此

可以用下面這張圖來理解:

【C++基礎(chǔ)(十)】C++泛型編程--模板初階,C++從入門到精通,c++,開發(fā)語言


4. 函數(shù)模板實例化

  1. 隱式實例化

讓編譯器根據(jù)實參推演模板參數(shù)實際類型

template<class T>
T Add(const T& left, const T& right)
{
	 return left + right;
}
int main()
{
	 int a1 = 10, a2 = 20;
	 double d1 = 10.0, d2 = 20.0;
	 Add(a1, a2);
	 Add(d1, d2);
 }

第一次調(diào)用的T被推演為int類型
第二粗調(diào)用的T被推演為double

不能這樣寫代碼:

Add(a1, d1);

系統(tǒng)根據(jù)a1推演出T是int類型
但是d1是double類型不能用int
類型的參數(shù)啦接受,所以會報錯


  1. 顯示實例化

在函數(shù)名后的<>中指定模板參數(shù)的類型

int main(void)
{
 int a = 10;
 double b = 20.0;
 
 // 顯式實例化
 Add<int>(a, b);
 return 0;
}

如果類型不匹配
編譯器會嘗試進行隱式類型轉(zhuǎn)換
若無法轉(zhuǎn)換成功編譯器將會報錯


5. 函數(shù)模板參數(shù)的匹配規(guī)則

模板函數(shù)和普通函數(shù)可以同時存在:

// 專門處理int的加法函數(shù)
int Add(int left, int right)
{
 	return left + right;
}
// 通用加法函數(shù)
template<class T>
T Add(T left, T right)
{
 	return left + right;
}

在調(diào)用函數(shù)時若參數(shù)和非模板函數(shù)匹配
那么編譯器會優(yōu)先調(diào)用非模板函數(shù)
若非模板函數(shù)不匹配或模板函數(shù)更匹配
那么編譯器會優(yōu)先調(diào)用模板函數(shù)

Add(10,20)//調(diào)用非模板
Add(11.1,6.3);//調(diào)用模板

6. 類模板

類模板的應(yīng)用非常廣泛
像開頭提到的數(shù)據(jù)結(jié)構(gòu)問題

類模板的定義格式:

template<class T1, class T2, ..., class Tn>
class example
{
 // 類內(nèi)成員定義
};

和函數(shù)模板類似,類模板也可以同時
定義多個模板參數(shù)

寫一個簡易的順序表:

template<class T>
class Vector
{ 
public :
 Vector(size_t capacity = 10)
 : _Data(new T[capacity])
 , _size(0)
 , _capacity(capacity)
 {}
 T& operator[](size_t pos)
 {
	 assert(pos < _size);
	 return _Data[pos];
 }
 
private:
 T* _Data;
 size_t _size;
 size_t _capacity;
};

所有實際類型需要出現(xiàn)的地方用T代替


7. 類模板的實例化

和函數(shù)模板不同,類模板沒有隱式推演
用戶必須顯示實例化

Vector<int> v1;

注意:
Vector是類名
Vector< int >才是類型

當(dāng)在類中聲明一個函數(shù)
但是想在類外定義時
若函數(shù)的參數(shù)或內(nèi)部使用的類型
和模板有關(guān)系,那么必須這樣寫:

template<class T>
class Vector
{ 
public :
    //類中聲明函數(shù)
	void push_back(T x);
private:
 T* _Data;
 size_t _size;
 size_t _capacity;
};

類外定義:

template<class T>
void Vector<T>::push_back(T x)
{
	_Date[_size] = x;
	_size++;
}

注:必須要再加上類模板template
并且要指定類域


8. 總結(jié)以及拓展

泛型編程是C++的一大利器
它極大的減少了代碼的復(fù)雜程度
并且增加了代碼的可讀性

C++基礎(chǔ)部分的內(nèi)容已經(jīng)全部結(jié)束
下一階段進入C++中階:STL的使用

【C++基礎(chǔ)(十)】C++泛型編程--模板初階,C++從入門到精通,c++,開發(fā)語言

拓展:

泛型編程拓展閱讀文章來源地址http://www.zghlxwxcb.cn/news/detail-642530.html


?? 下期預(yù)告:STL庫的介紹以及使用 ??

到了這里,關(guān)于【C++基礎(chǔ)(十)】C++泛型編程--模板初階的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C++泛型編程之模板

    C++泛型編程之模板

    目錄 一、什么是泛型編程? 二、函數(shù)模板 2.1函數(shù)模板的概念 2.2函數(shù)模板格式 2.3函數(shù)模板的原理 ?2.5函數(shù)模板的實例化 2.6模板參數(shù)的匹配原則 三、類模板 3.1類模板的定義格式 3.2 類模板的實例化 四、非類型模板參數(shù) 五、模板的特化 5.1模板特化的概念: 5.2函數(shù)模板特化 5

    2024年02月07日
    瀏覽(19)
  • 【C++】泛型編程——模板進階

    【C++】泛型編程——模板進階

    在之前的文章里,我們進行了模板初階的學(xué)習(xí)( 【C++】泛型編程——模板初階),了解了什么是泛型編程,學(xué)習(xí)了函數(shù)模板和類模板。 那這篇文章,我們繼續(xù)學(xué)習(xí)模板進階的內(nèi)容的學(xué)習(xí)。 首先我們來回顧一下: 我們在模板初階的學(xué)習(xí)中,定義模板參數(shù)是怎么定義的? 是不

    2024年02月16日
    瀏覽(19)
  • C++ 泛型編程:函數(shù)模板

    C++ 泛型編程:函數(shù)模板

    當(dāng)需要編寫通用的代碼以處理不同類型的數(shù)據(jù)時,C++ 中的函數(shù)模板是一個很有用的工具。函數(shù)模板允許我們編寫一個通用的函數(shù)定義,可以用于多種不同的數(shù)據(jù)類型,從而提高代碼的重用性和靈活性。 泛型編程 是一種編程范式,旨在實現(xiàn)可重用、通用性高的代碼。它允許我

    2024年02月12日
    瀏覽(19)
  • 【C++】泛型編程 ② ( 函數(shù)模板與普通函數(shù)區(qū)別 )

    【C++】泛型編程 ② ( 函數(shù)模板與普通函數(shù)區(qū)別 )

    函數(shù)模板與普通函數(shù)區(qū)別 : 主要區(qū)別在于它們能夠處理的 數(shù)據(jù)類型數(shù)量 和 靈活性 ; 自動類型轉(zhuǎn)換 : 函數(shù)模板 不允許 自動類型轉(zhuǎn)化 , 會進行嚴格的類型匹配 ; 普通函數(shù) 能夠進行 自動類型轉(zhuǎn)換 , 內(nèi)含隱式的類型轉(zhuǎn)化 ; 參數(shù) / 返回值 數(shù)據(jù)類型 : 普通函數(shù) 只接受 特定類型 參數(shù)

    2024年02月20日
    瀏覽(25)
  • 【C++】泛型編程 ③ ( 函數(shù)模板 與 普通函數(shù) 調(diào)用規(guī)則 | 類型匹配 | 顯式指定函數(shù)模板泛型類型 )

    【C++】泛型編程 ③ ( 函數(shù)模板 與 普通函數(shù) 調(diào)用規(guī)則 | 類型匹配 | 顯式指定函數(shù)模板泛型類型 )

    上一篇博客 【C++】泛型編程 ② ( 函數(shù)模板與普通函數(shù)區(qū)別 ) 中 , 分析了 函數(shù)參數(shù) 類型匹配 下的 普通函數(shù) 與 函數(shù)模板 的調(diào)用規(guī)則 ; 為 函數(shù)模板 重載了 普通函數(shù) , 普通函數(shù)有指定的類型 ; 傳入實參 , 調(diào)用 普通函數(shù) 還是 模板函數(shù) , 是有一定的規(guī)則的 ; 普通函數(shù) 與 傳入實

    2024年02月21日
    瀏覽(18)
  • 【c++ primer 筆記】第 16章 模板與泛型編程

    【c++ primer 筆記】第 16章 模板與泛型編程

    ??作者簡介:?? 博主在讀機器人研究生,目前研一。對計算機后端感興趣,喜歡 c + + , g o , p y t h o n , 目前熟悉 c + + , g o 語言,數(shù)據(jù)庫,網(wǎng)絡(luò)編程,了解分布式等相關(guān)內(nèi)容 textcolor{orange}{博主在讀機器人研究生,目前研一。對計算機后端感興趣,喜歡c++,go,python,目前熟悉c+

    2024年02月20日
    瀏覽(28)
  • C++、STL標準模板庫和泛型編程 ——適配器、補充(侯捷)

    C++、STL標準模板庫和泛型編程 ——適配器、補充(侯捷)

    侯捷 C++八部曲筆記匯總 - - - 持續(xù)更新 ! ! ! 一、C++ 面向?qū)ο蟾呒夐_發(fā) 1、C++面向?qū)ο蟾呒壘幊?上) 2、C++面向?qū)ο蟾呒壘幊?下) 二、STL 標準庫和泛型編程 1、分配器、序列式容器 2、關(guān)聯(lián)式容器 3、迭代器、 算法、仿函數(shù) 4、適配器、補充 三、C++ 設(shè)計模式 四、C++ 新標準 五、

    2023年04月27日
    瀏覽(28)
  • C++、STL標準模板庫和泛型編程 ——迭代器、 算法、仿函數(shù)(侯捷)

    C++、STL標準模板庫和泛型編程 ——迭代器、 算法、仿函數(shù)(侯捷)

    侯捷 C++八部曲筆記匯總 - - - 持續(xù)更新 ! ! ! 一、C++ 面向?qū)ο蟾呒夐_發(fā) 1、C++面向?qū)ο蟾呒壘幊?上) 2、C++面向?qū)ο蟾呒壘幊?下) 二、STL 標準庫和泛型編程 1、分配器、序列式容器 2、關(guān)聯(lián)式容器 3、迭代器、 算法、仿函數(shù) 4、適配器、補充 三、C++ 設(shè)計模式 四、C++ 新標準 五、

    2023年04月25日
    瀏覽(34)
  • 【C++】泛型編程 ① ( 函數(shù)模板 | 函數(shù)模板概念 | 函數(shù)模板意義 | 函數(shù)模板定義語法 | 函數(shù)模板調(diào)用語法 | 顯式類型調(diào)用 | 自動類型推導(dǎo) )

    【C++】泛型編程 ① ( 函數(shù)模板 | 函數(shù)模板概念 | 函數(shù)模板意義 | 函數(shù)模板定義語法 | 函數(shù)模板調(diào)用語法 | 顯式類型調(diào)用 | 自動類型推導(dǎo) )

    在 C++ 語言中 , 泛型編程 的 核心就是 函數(shù)模板 和 類模板 ; 函數(shù)模板 Function Template 是 C++ 語言 中的 重要特性 ; 函數(shù)模板概念 : 建立一個 \\\" 通用函數(shù) \\\" , 不指定該函數(shù)的 函數(shù)返回值類型 和 函數(shù)參數(shù)類型 , 僅使用 \\\" 虛擬類型 \\\" 代表 上述 兩種類型 , 該 \\\" 通用函數(shù) \\\" 就是 \\\" 函數(shù)模

    2024年02月19日
    瀏覽(28)
  • 【C++初階】第一站:C++入門基礎(chǔ)(中)

    【C++初階】第一站:C++入門基礎(chǔ)(中)

    前言: 這篇文章是c++入門基礎(chǔ)的第一站的中篇,涉及的知識點 函數(shù)重載 : 函數(shù)重載的原理--名字修飾 引用:概念、特性、使用場景、常引用、傳值、傳引用效率比較的知識點 目錄 5. 函數(shù)重載 (續(xù)) C++支持函數(shù)重載的原理--名字修飾(name Mangling) 為什么C++支持函數(shù)重載,而C語言

    2024年02月05日
    瀏覽(51)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包