文章目錄
- 模板
- 一、模板基本語法
- 二、函數模板
- 1.基本語法
- 2.函數模板注意事項
- 3.普通函數和函數模板區別
- 4.普通函數和函數模板調用規則
- 三、類模板
- 1.基本語法
- 2.類模板和函數模板的區別
- 3.類模板中成員函數調用時機
- 4.類模板對象做函數參數
- 5.類模板與繼承
- 6.成員函數的類外實現
模板
一、模板基本語法
template <typename T>
- template – 聲明創建模板。
- typename —表明其后面的符號是一種數據類型,可使用class代替。
- T —通用的數據類型,名稱可以替換,通常用大寫字母。
二、函數模板
1.基本語法
template<typename T>
void swap(T& a,T& b)
{T temp = a;a = b;b = a;
}
使用這個模板,有2種調用方法。
//1.自動類型推到
int a = 10;
int b = 20;
swqp(a,b);//2.顯示指定數據類型
swap<int>(a,b);
2.函數模板注意事項
- 自動類推導,必須推導出相同的數據類型,才可以使用。
- 模板必須確定數據類型T才可以使用。
3.普通函數和函數模板區別
- 普通函數調用時可以實現隱式類型轉換。
- 函數模板使用自動類型推導,不可以實現隱式類型轉換。
- 函數模板使用顯示指定類型,可以實現隱式類型轉換。
普通函數 | 函數模板-自動類型推導 | 函數模板-顯示指定類型 | |
---|---|---|---|
隱式類型轉換 | √ | × | √ |
4.普通函數和函數模板調用規則
- 如果函數模板和普通函數都可以調用,優先調用普通函數。
- 可以使用空模板參數列表,調用模板函數。
- 函數模板可以發生函數重載。
- 如果函數模板可以產生更好的匹配,優先調用函數模板。
void print(int a,int b)
{cout << "普通函數" << endl;cout << a << endl;cout << b << endl;
}template<typename T>
void print(T a,T b)
{cout << "模板函數" << endl;cout << a << endl;cout << b << endl;
}template<typename T>
void print(T a,T b,T c)
{cout << "模板函數" << endl;cout << a << endl;cout << b << endl;cout << c << endl;
}int main()
{int a = 10;int b = 20;//調用普通函數print(a,b);//調用模板函數print<>(a,b);//函數重載print(a,b,10);return 0;
}
三、類模板
1.基本語法
template <typename T,typename Y>
class Persion
{
public:T name;Y age;
};
2.類模板和函數模板的區別
- 類模板沒有自動類型推導的使用方式。
- 類模板在模板參數列表中可以有默認參數。
//帶有默認參數
template<typename T, typename Y = int>
class Person
{
public:T name;Y age;
};
3.類模板中成員函數調用時機
類模板中的成員函數在調用時才創建。
4.類模板對象做函數參數
template<typename T1, typename T2>
class Person
{
public:T1 name;T2 age;
};
- 指定傳入的類型(最常用)
void test0(Person<string, int>& p)
{.....
}
- 參數模板化
template<typename T1,typename T2>
void test1(Person<T1,T2>& p)
{....
}
- 整個類模板化
template<typename T>
void test2(T& p)
{....
}
5.類模板與繼承
- 當子類繼承的父類是一個類模板時,子類在聲明的時候,要指出父類的類型。
- 如果不指定,編譯器無法給子類分配內存。
- 如果想靈活指定父類中T的類型,子類也需變為類模板。
template<typename T>
class Base
{T name;
};//指定父類的類型
class Son:public Base<int>
{};//子類變為模板類
template<typename T>
class Son :public Base<T>
{
};
6.成員函數的類外實現
template<typename T1,typename T2>
class Person
{
public:T1 name;T2 age;void show();
};//成員函數類外實現
template<typename T1,typename T2>
void Person<T1,T2>::show()
{....
}