C++ 筆記 | 第6課 模版
把類型參數化的程序被稱爲一個模板(template),使用模板只是簡化程序的代碼書寫,並不能提高程序的執行效率。
C++ 模板主要針對函數和類等,形成: 函數模板、類模板、數組類模板
語法形式爲:
template < 模板參數表 > 聲明
函數模版
編譯系統會根據實際調用情況,由函數模板生成重載的模板函數實例。
如果一個函數模板聲明定義中有局部的靜態對象,那麼這個靜態對象也會在每個模板函數中被定義,各模板函數中的靜態變量是相互獨立的。
模版參數表可以是:class 標識符
和 typename 標識符
,標誌符可以是數據類型或是類類型
template <模版參數表>
函數返回類型 函數模板名(形參表) {函數體}
// 如
template <typename T>
T abs(T a) {return a < 0 ? -a : a;}
// 如
template <class X, class Y>
X fun(X x, Y y) { // 模板參數必須出現在函數聲明的形參表中
return x + y;
}
函數模版實參
在調用函數模板時,單獨用函數模板實參來說明模板參數的類型
template <class X, class Y, class Z>
Z fun(X x, Y y) {return x + y;}
// 調用
fun<int, long, double>(a, b) // 給 X Y Z 直接賦值
在函數模板中,可以用一般修飾符說明的常規參數,
template <typename T, int Rows, int Cols>
void sumRow(T data[][Cols], T result[]) {
int i, j;
for (i = 0; i < Rows; i++) {result[i] = 0;
for (j = 0; j < Cols; j++) result[i] += data[i][j];
}
}
// 調用
sumRow<double, 3, 4>(A, result);
冒泡排序模版
using namespace std;
template <class ET> // 也可寫爲 template <typename ET>
void bubsort(ET p[], int n) {
int m, k, j, i;
ET d; // 用來交換的中間變量 k=0; m=n-1;
while (k < m) { // 子表未空
j = m - 1;
m = 0;
for (i = k; i <= j; i++) // 從前往後掃描子表
if (p[i] > p[i + 1]) { // 發現逆序進行交換
d = p[i];
p[i] = p[i + 1];
p[i + 1] = d;
m = i;
}
j = k + 1;
k = 0;
for (i = m; i >= j; i--) // 從後往前掃描子表
if (p[i - 1] > p[i]) { // 發現逆序進行交換
d = p[i];
p[i] = p[i - 1];
p[i - 1] = d;
k = i;
}
}
return;
}
類模版
template <模板參數表>
class 類名 {類成員聲明}
成員函數若要在類模板外定義,需要寫成下面的形式:
template <模板參數表>
類型名 類名 <T>:: 成員函數名(形參表)
類模版中的常量參數化
在類模板中,可以對常量進行參數化,這稱爲類模板的常量參數化。
template <class T, int N>
class Array {
public:
T &operator[](int i);
private:
T buf[N];
};
template <class T, int N> // 重載 [] 操作符函數模板
T &Array<T, N>::operator[](int i) {return buf[i];
}