函數模板
類模板
- 定義:函數模板是建立一個通用函數,它所用到的數據的類型(包括返回值類型、形參類型、局部變量類型 )可以不具體指定,而是用一個虛擬的類型來代替(用標識符占位),在函數調用時,編譯器根據傳入實參自動推斷數據類型 。
- 語法格式:
template <typename T> // 也可用class代替typename ,T為類型參數,可多個,用逗號分隔 返回值類型 函數名(T 參數) {// 函數體 }
例如,實現交換兩個變量值的函數模板
template <typename T> void Swap(T& a, T& b) {T temp = a;a = b;b = temp; }
- 使用方式:編譯器根據調用時傳入的實參類型,對函數模板進行實例化,生成具體類型的函數。比如
int num1 = 1, num2 = 2; Swap(num1, num2);
,編譯器會生成void Swap(int&, int&)
?這樣針對int
類型的函數實例 。也可顯式指定類型,如Swap<double>(3.14, 2.71);
?。 - 作用:避免為不同數據類型重復編寫功能相似的函數,提高代碼復用性 ,減少代碼冗余。
- 定義:類模板將數據的類型參數化,用于創建通用類,使類的成員函數和成員變量能適應多種數據類型 。
- 語法格式:
- 類聲明:
template <typename T1, typename T2, ...> // 類型參數可多個,用逗號分隔 class 類名 {// 類的成員變量和成員函數聲明 };
類外定義成員函數
template <typename T1, typename T2, ...> 返回值類型 類名<T1, T2, ...>::函數名(參數列表) {// 函數體 }
例如,定義一個表示坐標的類模板:
template <typename T1, typename T2> class Point { public:Point(T1 x, T2 y) : x(x), y(y) {}void print() const; private:T1 x;T2 y; };template <typename T1, typename T2> void Point<T1, T2>::print() const {std::cout << "x: " << x << ", y: " << y << std::endl; }
- 使用方式:使用類模板創建對象時,必須顯式指明具體的數據類型,編譯器據此實例化出具體類。如
Point<int, int> p(1, 2);
?,編譯器會用int
替換模板中的T1
和T2
?,生成針對int
類型的Point
類實例 。 - 作用:能針對不同數據類型創建相似功能的類,避免為每種類型單獨編寫類,提高代碼的可維護性和復用性 。
- 類聲明:
二者區別
- 實例化方式:函數模板可由編譯器根據實參自動實例化,也可顯式指定類型;類模板必須顯式指定類型參數來實例化 。
- 功能側重:函數模板主要針對可通用化的函數邏輯;類模板關注的是創建通用類,涵蓋數據成員和成員函數 。