函式模板與類模板(模板類)
阿新 • • 發佈:2019-01-08
模板分為函式模板和類模板
函式模板是不區分型別的
函式模板是template<typename T1,typenameT2,.....typename Tn>
template<class T>
T1 Add( T &left, T &right)
{
return left + right;
}
typename是函式模板的關鍵字,也可以用class代替(但是一定不能用struct代替)
當然你可以不止定義一個引數,你可以定義多個引數:
//template<class T1,class T2> //T1 Add( T1 left, T2 right) //{ // return left + right; //} //int main() //{ // int a1 = 10, a2 = 20; // double b1 = 10.1, b2 = 9.9; // cout<<Add(a1, a2); // cout<<Add(b1, b2); // cout << Add(a1, (int)b1); // return 0; //}
當然說到這裡就不得不說說關於函式模板的例項化:
函式模板的例項化分為顯式例項化和隱式例項化,就是讓不同型別的引數去轉化成同一型別去進行運算
上面那個程式碼“cout<<Add(a1,(int)b1)”,就是將b1的型別轉化為int進行運算,這就是隱式例項化
而顯式例項化就是下面這個程式碼
{
int a = 10;
double b = 2.3;
cout<<Add<int>(a, b)<<endl;
return 0;
}*
引數的匹配規則:
1.同名的非模板函式和一個函式模板,而且這個函式模板還可以被例項化為這個非模板函式;
2.如果引數不存在型別不匹配,優先選擇非模板函式,其次再看匹配進行選擇函式模板;
3.模板函式不允許自動型別轉化,但是一般函式可以。
那麼還是讓我們來看程式碼吧。
#include<iostream> using namespace std; //template<class T1,class T2> //T1 Add( T1 left, T2 right) //{ // return left + right; //} //int main() //{ // int a1 = 10, a2 = 20; // double b1 = 10.1, b2 = 9.9; // cout<<Add(a1, a2); // cout<<Add(b1, b2); // cout << Add(a1, (int)b1); // return 0; //}隱式型別轉化 /*int main() { int a = 10; double b = 2.3; cout<<Add<int>(a, b)<<endl; return 0; }*///顯示型別轉化 //int Add(int left, int right) //{ // return left + right; //} //void test() //{ // cout<<Add(1, 2)<<endl; // cout<<Add(1, 5.0)<<endl; //} //int main() //{ // test(); // return 0; //}
你可以除錯去探究到底哪個引數呼叫nage函式。
類模板:類模板的格式template<class T1,class T2....classTn>
class 類模板名
{
類成員
};
讓我們來看下程式碼,更好理解;
template<class T>
class Time
{
public:
Time(T hour = 10, T minute = 20, T sec = 10)
:_hour(hour)
, _minute(minute)
, _sec(sec)
{}
~Time()
{
cout << "~Time" << endl;
};
void diaplay();
private:
T _hour;
T _minute;
T _sec;
};
template<class T>
void Time<T>::diaplay()
{
cout << _hour << ":" << _minute << ":" << _sec << endl;
}
int main()
{
Time <int>t1(20,10);
t1.diaplay();
return 0;
}
注意:類模板函式放在類外定義時,一定要加模板引數列表。
類模板的例項化:類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<> 中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。
模板類是類模板例項化後的結果:舉個簡單例子 類模板相當於一個做餅乾的模板,你可以用這個模板做出餅乾,然而至於做出來是什麼味道,就要看你用什麼東西去例項化,你可以奶油,也可以用巧克力。這些東西不同雖然做出來都是餅乾但是味道不同。