前言:哈嘍小伙伴們好久不見,這是2024年的第一篇博文,我們將繼續C++的學習,今天這篇文章,我們來習一下——模版。
目錄
一.什么是模版
二.模版分類
1.函數模版
?2.類模板
總結
一.什么是模版
說起模版,我們都很容易想到套模版這個詞匯:給你一個固定的格式,然后按照這個格式去完成你的作品之類的。
而我們C++中的模版也確實如此,它包括函數模版和類模版兩種,它的格式為:
template<typename/class?T1,.......>
void fun(T1 .....)
其中template是定義模版的關鍵字,而typename和class則是定義模版參數的關鍵字,二者都可以使用,模版的參數可以不止一個,T1就代表一個要套用模版的參數類型,而T1并不是固定的寫法,而是因為類型的英文為type而一般情況下都默認為T。
要注意的是定義模版之后,要使用模版的函數要緊挨定義,二者中間不能有任何其他代碼。
二.模版分類
1.函數模版
我們經常使用swap交換函數這個簡單的函數,但是有一個問題是,普通的函數只能定義單一的參數類型,就算可以使用typedef來重定義,在改變類型時我們也需要不斷的修改,這依然不是很方便。
所以我們引入了函數模版這個概念,使用函數模版定義的函數,無論傳入任意類型的參數,都可以實現其功能。
下面我們就以swap交換函數為例來介紹模版的具體用法:
#include<iostream>
using namespace std;
template<typename T>
void Swap(T& a, T& b)
{T temp = a;a = b;b = temp;
}
int main()
{int a = 1;int b = 2;Swap(a, b);cout << a << ' ' << b << endl;double x = 1.1;double y = 2.2;Swap(x, y);cout << x << ' ' << y << endl;}
如上,套用模版的函數,其參數類型即為T,隨后在使用時,我們只需要將要交換的數據傳入,T便會接收并自動轉換為該實參的類型,即可完成不同類型的實參共用一個函數的結果:
但是這樣的寫法,卻只能滿足相同類型實參直接的交換,如果想要操作不同類型的實參,則需要模版函數也存在同樣數量的參數類型數量:
#include<iostream>
using namespace std;template<typename T1,typename T2>void Add(T1 a, T2 b)
{cout<< a + b <<endl;
}
int main()
{int a = 1;double b = 2.2;Add(a, b);return 0;
}
在調用函數模版時,T1便會接受a的類型,T2則接收b的類型,結果如下:
除此之外,一個模版函數還可以與一個同名的非模版函數同時存在,這類似于函數重載:
#include<iostream>
using namespace std;template<typename T1,typename T2>void Add(T1 a, T2 b)
{cout<< a + b <<endl;
}
void Add(int a, int b)
{cout << a + b << endl;
}
int main()
{int a = 1;int c = 2;double b = 2.2;Add(a, c);Add(a, b);return 0;
}
當這種情況存在時,Add函數會默認先去調用非模版參數去判斷參數類型是否一致,一致則使用該非模版函數,不一致則去調用模版函數。?
?2.類模板
類模版的寫法就和函數模版類似了,其作用都是將一些類型不確定或是經常改變的變量的類型用模版去代替。比如我們實現一個順序表:
template<typename T>
class Qlist
{
public:void Pushback(T& a, T n){....}
private:T* _a;int _size;int _capacity;
};
int main()
{Qlist<int> q;return 0;
}
我們只需要在創建順序表時給出數據類型即可。?
總結
模版的內容比較簡單,就分享到這里。
喜歡博主文章的小伙伴記得一鍵三連,我們下期再見!