4.模板函數與模板類ios
其實我的認爲C++模板的概念跟其餘面向對象的語言中的泛型概念有些相似,在學習一門新的概念的時候咱們不妨將它跟它相似的概念類比的學習,這樣印象會更加的深入,模板的引入會讓程序更加的通用,同時避免了代碼的冗餘。app
定義模板有兩種方式,第一種:template<typename T1, typename T2> 第二種方式是:template<class T1, class T2> 本人推薦你們使用第一種方式,看起來比較直觀;接下來咱們來看一下模板函數以及模板類的實例:函數
頭文件:Test.h學習
#ifndef TEST2 #define TEST2 #include "iostream" using namespace std; template<typename T1, typename T2> void swap(T1 &value1, T2 &value2) { //Exchange of two Numbers T1 temp = value1; value1 = value2; value2 = temp; return; } template<typename T1, typename T2> class A { private: T1 valueA; public: A(); A(T2 value); ~A(); T1 print(T2 value) { cout << "The Value is :" << value <<endl; return valueA; }; }; //The class A realize. template<typename T1, typename T2> A<T1, T2>::A() { valueA = 0; } template<typename T1, typename T2> A<T1, T2>::A(T2 value) { valueA = value; } template<typename T1, typename T2> A<T1, T2>::~A() { cout << "This is A class." << endl; } #endif
函數文件:Test.cppspa
// Test1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "Test2.h" int main(void) { char str1 = 'A'; char str2 = 'B'; A<int, char> *objectA = new A<int, char>(str1); int temp = objectA->print(str2); cout << "The A ASCII number is :" << temp << endl; int value1 = 12; int value2 = 13; double value3 = 14.12; cout << "Swap befor value1 = "<< value1 <<endl; cout << "Swap befor value2 = "<< value2 <<endl; swap<int, int>(value1, value2); cout << "Swap after value1 = "<< value1 <<endl; cout << "Swap after value2 = "<< value2 <<endl; cout << "Swap befor value1 = "<< value1 <<endl; cout << "Swap befor value3 = "<< value3 <<endl; swap<int, double>(value1, value3); cout << "Swap after value1 = "<< value1 <<endl; cout << "Swap after value3 = "<< value3 <<endl; return 0; }
輸出的結果爲:code
從中能夠看出咱們只定義了一個swap模板函數,卻能夠有不一樣的入參;一樣類A爲模板類,能夠給它定義不一樣類型的對象,從而實現功能的多樣化。對象
必定要注意的是要按照像上述代碼那樣來定義和實現模板類和模板函數,本人初學模板的時候也出現過不少概念上的錯誤。編譯器
細心地人會發現,swap函數在交換value1和value3的時候發生了隱式的類型轉換,即將doule類型轉換爲int類型,從而將14.12轉換爲14,固然在編譯的時候編譯器也會發出一個警告:io
因此利用模板的時候必定要仔細認真,要肯定這種隱式的類型轉換,從而避免沒必要要的錯誤發生。console
<未完待續>