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

C++ 模板完整指南:函數模板、類模板、非類型參數與實戰規範

     編輯:關於C語言

前言

模板是 C++ 實現**泛型編程**的核心機制,支援**類型參數化**,實現真正的代碼複用。分為函數模板與類模板兩大類。本文系統梳理語法規範、定義格式、常見錯誤與非類型參數用法。

一、函數模板

語法骨架

template   // 或 typename T
ReturnType FunctionName(ParamList) {
    // 函數體,使用 T 作為類型
}
  • template 關鍵字不可省略
  • class/typename 等價,每個類型參數前必須加
  • 多參數用逗號分隔:template
  • 模板聲明與函數定義之間不允許有其他語句

範例:通用最大值

template 
T max(T &x, T &y) {  // 參數用引用避免拷貝
    return (x > y) ? x : y;
}

int main() {
    int i1=3, i2=5;
    char c1='a', c2='b';
    double d1=0.35, d2=0.2;
    cout << max(i1,i2) << max(c1,c2) << max(d1,d2);
}

二、類模板

定義格式(重點)

// template.h
template 
class MyClass {
private:
    T1 m_i; T2 m_j;
public:
    MyClass(T1 a, T2 b);      // 構造函數聲明
    void Show();              // 成員函數聲明
};

// 類外定義:每個成員函數前必須加模板聲明,類名帶參數
template 
MyClass::MyClass(T1 a, T2 b) : m_i(a), m_j(b) {}

template 
void MyClass::Show() {
    cout << "I=" << m_i << ", J=" << m_j << endl;
}

實例化使用

MyClass obj1(1, 2);
MyClass obj2('a', 'b');
obj1.Show(); obj2.Show();

關鍵規範總結

  1. 類模板定義時:template <...> class Name { ... };
  2. 成員函數類外定義時:template <...> RetType Name::Func(...)
  3. 實例化時:Name var(args);
  4. 凡涉及模板參數的成員函數,定義必須在類外且帶模板聲明(或直接在類內定義)

三、非類型模板參數

模板參數除類型外,還可為:

  • 整型常量 (含 enum):template
  • 外部鏈接物件的指標/引用

不可用:浮點數、內部鏈接物件指標、字串字面值。

範例:固定容量棧

template 
class Stack {
    T _elems[MAXSIZE];
    int _top;
public:
    Stack() : _top(0) {}
    void Push(const T& v) { _elems[_top++] = v; }
    T Pop() { return _elems[--_top]; }
};

int main() {
    Stack s1;
    Stack s2;
    // s1 與 s2 是完全不同的類型
}

四、常見錯誤與避坑指南

五、最佳實踐建議

  • 優先用 typename 替代 class,語意更清晰
  • 模板代碼盡量放在標頭檔(或 .inl 包含),便於編譯器實例化
  • 善用 static_assert 约束模板參數(C++11)
  • 非類型參數優先用 size_t 或 int 表示容量/維度

掌握格式規範,模板不再難寫。本文參考網路資料整合實踐經驗而成。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤正確原因
模板聲明與函數間插入語句緊貼語法規定
類模板成員函數定義漏掉 template<...>每個成員函數定義前加編譯器需知曉模板參數
實例化寫成 MyClass 而非 MyClass obj;加變數名實例化需產生對象
函數模板參數未用引用用 T& 或 const T&避免不必要拷貝,支援臨時對象