C++ 基礎之函數模板和類模板

C++ 基礎之函數模板和類模板

C++ 有別於 C ,比較重要的就是其抽象、封裝、繼承和多態等特性。多態又具體地體現在重載、虛函數和模板等等之上。

今天就和大家聊一聊函數模板和類模板。

函數模板

我們來看函數重載:
在這裏插入圖片描述

觀察發現,這幾個函數代碼基本相同,只有參數類型不同,功能相同。問題就來了:寫多個相同的函數體,是重複勞動,而且還可能因爲代碼的冗餘造成不一致性。就不能找個東西去通用地表示和替代這些類型嗎?

編寫通用代碼適用於多種不同的數據類型,講三個函數寫成通用的一個函數——函數模板。函數模板的基本原理是通過數據類型的參數化,將一組算法相同但所處理數據類型不同的重載函數凝練成一個函數模板。

怎麼定義呢?只需要在原來的函數定義前加上template <class 標識符>或者template <typename 標識符>,就可以用這個標識符來通用地表示變量類型了。來看一個例子。

在這裏插入圖片描述

編譯器從調用swaptemp()時實參的類型,推導出函數模板的類型參數。當類型參數的含義確定後,編譯器將以函數模板爲樣板,生成一個函數。比如,如果調用表達式swaptemp(a,b),若實參 a、b 爲 int 型,推導出模板中類型參數 T 爲 int 。此時,生成的函數爲:

void swaptemp(int& x,int& y)
{ int temp;
temp=x;
x=y;
y=temp;
}

返回類型也可以用類型參數 T 類定義:

在這裏插入圖片描述

函數模板也可以有多個類型參數:
在這裏插入圖片描述

函數模板方法克服了 C 語言用大量不同函數名錶示相似功能的壞習慣。克服了 C++ 函數重載用相同函數名字重寫幾個函數的繁瑣。函數模板是 C++ 中功能最強的特性之一,是提高軟件代碼重用率的重要手段。

類模板

和函數模板類似,應用模板技術,可以將一組功能相同但所處理數據類型不同的類凝練成一個類模板。編譯時,再由編譯器按照類模板自動生成針對不同數據類型的類定義代碼。類模板的聲明方式和函數模板是一模一樣的。

不過,有一個問題是函數模板有傳入參數,可以自動識別類型,從而確定類型參數該怎麼具體化。而對於類,並沒有一個傳入參數可供判別(類的構造函數,只是類的一份子,它的傳入參數,不能代表類的傳入參數)。怎麼辦呢?我們需要在實例化對象的時候,指定類型參數。例子如下。

在這裏插入圖片描述

對於類模板方法的定義,和一般的類的定義不同的地方在於:

  • 在每個模板定義之前,都需要在前面加上模板聲明:template<typename/class T>
  • 類模板和結構模板在定義和使用時,必須在名字後面綴上模板參數譬如<T>,寫如:Student<T>
    舉個例子如下:

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述

類模板也可以帶兩個類型參數:
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章