日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++::模板

發(fā)布時(shí)間:2023/11/30 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++::模板 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

模板的簡(jiǎn)單介紹

C++中模板是為了能夠使得函數(shù)或者類實(shí)現(xiàn)范型編程的目的, 同時(shí)C++模板的出現(xiàn)是為了避免代碼的冗余
舉個(gè)例子

void Swap(int& a, int& b) {int tmp = a;b = a;a = b; } void Swap(char& a, char& b) {char tmp = a;b = a;a = b; }

上面的函數(shù)除了類型不同以外, 其他都可以看成是完全形同的, 但是由于代碼不支持范型編程, 所以我們就必須將不同的類型都實(shí)現(xiàn)一遍.為了避免這種代碼冗余, 于是就出現(xiàn)的模板.
其中模板可以分為函數(shù)模板和類模板

函數(shù)模板

template <class T> void swap(T& a, T& b) {T tmp = a;a = b;b = a; } void TestSwap() {swap(1, 2); }

編譯器在執(zhí)行上述代碼的時(shí)候就會(huì)根據(jù)實(shí)參的不同自動(dòng)推演出類型, 然后將自己的類型傳給對(duì)應(yīng)的 T, 此時(shí)編譯器也就直到了參數(shù)的類型
注意 編譯器在進(jìn)行類型實(shí)例化的時(shí)候如果有現(xiàn)成的類型符合自己(不用經(jīng)過(guò)推演), 那么編譯器就會(huì)去調(diào)用現(xiàn)成的函數(shù), 當(dāng)沒(méi)有現(xiàn)成的函數(shù)給自己調(diào)用的時(shí)候, 但是有模板函數(shù), 此時(shí)編譯器就會(huì)是使用模板生成一份

模板類

template <class T> class Vector { public:Vector();~Vector();Vector(const Vector <T>& v);Vector& operator = (const Vector <T>& v);void Reserve(size_t size);void ReSize(size_t size, const T& value = T());const T& operator [] (size_t pos) const;void Insert(size_t pos, const T& x);void PushFront(const T& x);void PushBack(const T& x);void Erase(size_t pos);size_t Capacity();bool Empty();size_t Size();void PopBack();void PopFront(); protected:void Expand(size_t size); protected:T* _start;T* _finish;T* _endofstorage; };

上面代碼就是通過(guò)模板類實(shí)現(xiàn)Vector的各種操作. 在使用模板類的時(shí)候, 當(dāng)模板類成員函數(shù)定義在類體外的時(shí)候, 此時(shí)應(yīng)該注意, 書(shū)寫格式和原來(lái)的就會(huì)有所不同, 用上面Vector這個(gè)模板類來(lái)做個(gè)比方吧

template <class T> Vector& Vector <T>::operator = (const Vector <T>& v) {... }

小知識(shí)點(diǎn)總結(jié)

模板相關(guān)

模板在經(jīng)過(guò)實(shí)例化之后才會(huì)生成指令. 編譯器在進(jìn)行編譯的時(shí)候只會(huì)對(duì)模板的外殼進(jìn)行語(yǔ)法檢查不會(huì)對(duì)它的內(nèi)容進(jìn)行檢查

Vector增容做了哪些事情

Vector在增容的時(shí)候它會(huì)做兩件事情, 第一件事情就是進(jìn)行動(dòng)態(tài)內(nèi)存開(kāi)辟. 當(dāng)開(kāi)辟完內(nèi)存之后, 它會(huì)看一下此時(shí)的類型是自定義類型還是內(nèi)置類型, 如果是自定義類型就將原來(lái)空間上的內(nèi)容直接memcpy拷貝給新開(kāi)辟的這片空間, 然后釋放原來(lái)的內(nèi)存空間. 當(dāng)發(fā)現(xiàn)此時(shí)的類型是一個(gè)自定義類型的時(shí)候, 此時(shí)就要進(jìn)行深拷貝, 具體做法就是申請(qǐng)一片新的空間, 然后利用循環(huán)將原來(lái)空間中的值重新復(fù)制給新的這片空間, 最后釋放原來(lái)的空間

自動(dòng)定義類型之為什么需要深拷貝

加入此時(shí)的類型是一個(gè)sring類型, 當(dāng)進(jìn)行擴(kuò)容的時(shí)候編譯器會(huì)給其分配一個(gè)新的空間, 此時(shí)當(dāng)我們定義出來(lái)一個(gè)對(duì)象的時(shí)候, 如果出了作用域?qū)ο缶鸵鰳?gòu),當(dāng)進(jìn)行析構(gòu)的時(shí)候, 加入我們只是進(jìn)行了簡(jiǎn)單的memcpy此時(shí)新開(kāi)辟的空間中的string指向原來(lái)的空間, 但是當(dāng)我們memcpy完之后就會(huì)對(duì)其進(jìn)行釋放, 然而此時(shí)由于對(duì)象出了作用域就要進(jìn)行析構(gòu), 此時(shí)就會(huì)出現(xiàn)對(duì)一個(gè)野指針進(jìn)行銷毀, 當(dāng)然會(huì)出錯(cuò)

總結(jié)

以上是生活随笔為你收集整理的C++::模板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。