C++::模板
模板的簡(jiǎn)單介紹
C++中模板是為了能夠使得函數(shù)或者類實(shí)現(xiàn)范型編程的目的, 同時(shí)C++模板的出現(xiàn)是為了避免代碼的冗余
舉個(gè)例子
上面的函數(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++实现 简单 单链表