首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Primer 學習筆記 44:模板(二)—— 類模板與非型別模板參數

     編輯:關於C++

一、類模板

定義語法

template 
class ClassName {
    // 成員宣告
    T data;
public:
    void func(T arg);
};

// 成員函數定義需加模板前綴
template 
void ClassName::func(T arg) { ... }

實例化

ClassName obj;      // 產生具體類別 ClassName
ClassName obj2;  // 另一個具體類別

二、非型別模板參數

模板參數不限於型別,整數、指標、參考等編譯期常量皆可。

範例:固定大小堆疊

template 
class Stack2 {
    T elems_[MAX_SIZE];
    int top_;
public:
    Stack2() : top_(-1) {}
    void Push(const T& e) {
        if (top_ + 1 >= MAX_SIZE) throw out_of_range("Stack full");
        elems_[++top_] = e;
    }
    void Pop() { if (top_ < 0) throw out_of_range("Stack empty"); --top_; }
    T& Top() { if (top_ < 0) throw out_of_range("Stack empty"); return elems_[top_]; }
    bool Empty() const { return top_ == -1; }
};

使用

int main() {
    Stack2 s;  // 型別 int,容量 5
    s.Push(1); s.Push(2); s.Push(3);
    while (!s.Empty()) { cout << s.Top() << endl; s.Pop(); }
    return 0;
}

三、關鍵點

  • 非型別參數必須是編譯期常量(整數、enum、指標/參考的地址)。
  • 類模板成員函數定義需完整模板參數列表:template void Stack2::Push(...)。
  • 編譯器對每組具體參數產生獨立類別代碼(代碼膨脹風險)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved