C++中函數(shù)模板與類(lèi)模板的簡(jiǎn)單使用及區(qū)別介紹
在C++中,模板是實(shí)現(xiàn)泛型編程的核心機(jī)制,允許開(kāi)發(fā)者編寫(xiě)與類(lèi)型無(wú)關(guān)的代碼。以下是函數(shù)模板和類(lèi)模板的詳細(xì)介紹及實(shí)際示例。
一、函數(shù)模板
定義
函數(shù)模板通過(guò)參數(shù)化類(lèi)型實(shí)現(xiàn)泛型操作,只需編寫(xiě)一次代碼即可處理多種數(shù)據(jù)類(lèi)型,避免重復(fù)。
語(yǔ)法
template<typename T> 返回類(lèi)型 函數(shù)名(參數(shù)列表) { ... }
typename T
表示類(lèi)型占位符,編譯時(shí)根據(jù)實(shí)參類(lèi)型自動(dòng)實(shí)例化。
真實(shí)示例
交換兩個(gè)值(swap
)
template<typename T> void swap(T &a, T &b) { T temp = a; a = b; b = temp; }
使用場(chǎng)景:交換任意類(lèi)型的變量(如 int
、string
)。
int x = 1, y = 2; swap(x, y); // 自動(dòng)推導(dǎo)為 swap<int>
求最大值(max
)
template<typename T> T max(const T &a, const T &b) { return (a > b) ? a : b; }
使用場(chǎng)景:比較同類(lèi)型值的最大值,要求類(lèi)型支持 operator>
。
打印數(shù)組
int nums[] = {1, 2, 3}; printArray(nums); // 推導(dǎo) T=int, N=3
二、類(lèi)模板
定義
類(lèi)模板允許創(chuàng)建可處理多種數(shù)據(jù)類(lèi)型的類(lèi),成員變量和函數(shù)均可使用模板參數(shù)。
語(yǔ)法
template<typename T> class 類(lèi)名 { // 類(lèi)成員使用 T 作為類(lèi)型 };
真實(shí)示例
動(dòng)態(tài)數(shù)組(Array
)
template<typename T> class Array { private: T* data; size_t size; public: Array(size_t size) : size(size), data(new T[size]) {} ~Array() { delete[] data; } T& operator[](size_t index) { return data[index]; } size_t getSize() const { return size; } };
使用場(chǎng)景:存儲(chǔ)任意類(lèi)型的動(dòng)態(tài)數(shù)組。
Array<int> intArr(10); // 存儲(chǔ) int 的數(shù)組 Array<string> strArr(5); // 存儲(chǔ) string 的數(shù)組
鍵值對(duì)(Pair
)
template<typename T1, typename T2> class Pair { public: T1 first; T2 second; Pair(const T1 &f, const T2 &s) : first(f), second(s) {} };
使用場(chǎng)景:組合兩個(gè)不同類(lèi)型的數(shù)據(jù)(如字典條目)。
Pair<string, int> student("Alice", 90); // 姓名和分?jǐn)?shù)
棧(Stack
)
template<typename T> class Stack { private: std::vector<T> elements; public: void push(const T &elem) { elements.push_back(elem); } T pop() { if (elements.empty()) throw std::out_of_range("Stack is empty!"); T elem = elements.back(); elements.pop_back(); return elem; } };
使用場(chǎng)景:實(shí)現(xiàn)泛型棧結(jié)構(gòu),支持多種數(shù)據(jù)類(lèi)型。
Stack<double> doubleStack; doubleStack.push(3.14);
三、關(guān)鍵區(qū)別
特性 | 函數(shù)模板 | 類(lèi)模板 |
---|---|---|
類(lèi)型推導(dǎo) | 自動(dòng)推導(dǎo)參數(shù)類(lèi)型(無(wú)需顯式指定) | 必須顯式指定類(lèi)型(如 Stack<int> ) |
默認(rèn)模板參數(shù) | 支持(C++11起) | 支持(如 template<typename T = int> ) |
典型應(yīng)用 | 算法(如排序、交換) | 容器(如數(shù)組、棧、隊(duì)列) |
四、注意事項(xiàng)
- 編譯方式:模板代碼通常放在頭文件中,因?yàn)榫幾g器需在編譯時(shí)生成具體類(lèi)型的實(shí)例化代碼。
- 類(lèi)型約束:模板中的操作(如
operator>
)需在類(lèi)型T
中定義,否則編譯失敗。 - 性能:模板在編譯時(shí)展開(kāi),無(wú)運(yùn)行時(shí)開(kāi)銷(xiāo),但可能增加代碼體積。
通過(guò)合理使用模板,可以大幅提升代碼復(fù)用性,同時(shí)保持類(lèi)型安全和高性能。例如,標(biāo)準(zhǔn)模板庫(kù)(STL)中的 vector
、sort
均基于模板實(shí)現(xiàn)。
到此這篇關(guān)于C++中函數(shù)模板與類(lèi)模板的簡(jiǎn)單使用的文章就介紹到這了,更多相關(guān)C++函數(shù)模板與類(lèi)模板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享
WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的通信協(xié)議,與HTTP協(xié)議不同,它允許服務(wù)器主動(dòng)向客戶(hù)端發(fā)送數(shù)據(jù),而不需要客戶(hù)端明確地請(qǐng)求,本文主要給大家介紹了C++實(shí)現(xiàn)WebSocket服務(wù)器的案例,需要的朋友可以參考下2024-05-05C++實(shí)現(xiàn)Matlab的zp2tf函數(shù)的示例代碼
matlab?的?zp2tf?函數(shù)的作用是將極點(diǎn)形式的?H(s)?函數(shù)的分母展開(kāi),本文主要為大家介紹了C++實(shí)現(xiàn)Matlab的zp2tf函數(shù)示例代碼,需要的可以參考一下2023-04-04C++實(shí)現(xiàn)讀取圖片長(zhǎng)度和寬度
這篇文章主要介紹了C++實(shí)現(xiàn)讀取圖片長(zhǎng)度和寬度,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04OpenCV4.1.0+VisualStudio2019開(kāi)發(fā)環(huán)境搭建(超級(jí)簡(jiǎn)單)
這篇文章主要介紹了OpenCV4.1.0+VisualStudio2019開(kāi)發(fā)環(huán)境搭建(超級(jí)簡(jiǎn)單),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03基于Matlab實(shí)現(xiàn)離散系統(tǒng)分岔圖的繪制
這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)離散分岔圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下2022-04-04Visual C++ 6.0實(shí)現(xiàn)域名解析為IP的示例代碼
本文主要介紹了在Windows環(huán)境下,使用Visual C++ 6.0(VC6)編譯器,通過(guò)Winsock庫(kù)調(diào)用DNS服務(wù)完成域名到IP地址的轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03