C++ 筆記 | 第6課 模版

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>:: 成員函數名(形參表)

案例見CSDN | C++ 實例 | 棧類模版

類模版中的常量參數化

在類模板中,可以對常量進行參數化,這稱爲類模板的常量參數化。

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];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章