程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++入門學習——模板

C++入門學習——模板

編輯:C++入門知識

C++入門學習——模板


為什麼需要模板?

我們已經學過重載(Overloading),對重載函數而言,C++ 通過函數參數(參數個數、參數類型)的正確匹配來調用重載函數。例如,為求兩個數的最大值,我們定義 max () 函數需要對不同的數據類型分別定義不同重載(Overload)版本。

 

//函數1
int max(int x, int y);
{
	return(x>y)?x:y ;
}

//函數2
float max( float x, float y)
{
	return (x>y)?x:y ;
}

//函數3
double max(double x, double y)
{
	return (c>y)?x:y ;
}

現在,我們再重新審視上述的 max() 函數,它們都具有同樣的功能,即求兩個數的最大值,能否只寫一套代碼解決這個問題呢?這樣就會避免因重載函數定義不全面而帶來的調用錯誤(如,我們分別定義了 char a,b; 那麼在執行 max(a,b) 時 程序就會出錯,因為我們沒有定義char 類型的重載版本)。

 

同樣的,對於類而言,也存在同樣的問題(基本上是重復性的工作):

 

//對兩個整數作比較
class Compare_int
{
public:
	Compare(int a,int b){x=a;y=b;}
	int max( ) {return(x>y)?x:y;}
	int min( ) {return(xy)?x:y;}
	float min( ) {return(x

 

為解決上述問題 C++ 引入模板機制:模板就是實現代碼重用機制的一種工具,它可以實現類型參數化,即把類型定義為參數, 從而實現了真正的代碼可重用性。模版可以分為兩類,一個是函數模版,另外一個是類模版。

 

函數模板

函數模板的一般形式如下:

template 返回類型 函數名(形參表)

{

//函數定義體

}

其中 template 和 class 是關鍵字,class 可以用 typename 代替,在這裡 typename 和 class 沒區別,<> 括號中的參數叫模板形參,模板形參和函數形參很相像,模板形參不能為空。

 

一但聲明了類模板,函數中使用內置類型的地方都可以使用模板形參名來聲明。模板形參需要調用該模板函數時提供的模板實參來初始化模板形參,一旦編譯器確定了實際的模板實參類型就稱他實例化了函數模板的一個實例。

 

template  void swap(T& a, T& b)
{
	//……
}

 

當調用這樣的模板函數時類型 T 就會被被調用時的類型所代替,比如 swap(a,b) 其中 a 和 b 是 int 型,這時模板函數 swap 中的形參 T 就會被 int 所代替,模板函數就變為 swap(int &a, int &b)。而當 swap(c,d) 其中 c 和 d 是 double 類型時,模板函數會被替換為swap(double &a, double &b),這樣就實現了函數的實現與類型無關的代碼。
 

示例代碼如下:

 

#include 
using std::cout;
using std::endl;

//聲明一個函數模版,用來比較輸入的兩個相同數據類型的參數的大小,
//class也可以被typename代替,
//T可以被任何字母或者數字代替。

//template 
template  T max(T x,T y)
{ 
	return(x>y)?x:y;
}

int main()
{

    int a=2, b=10;
    cout<< "較大整數:"<

 

運行結果如下:

\

 

類模板

類模板的一般形式如下:

template class 類名 {

//類定義...

};

 

一但聲明了類模板就可以用類模板的形參名聲明類中的成員變量和成員函數,即可以在類中使用內置類型的地方都可以使用模板形參名來聲明。比如:

 

template  class A
{
public: 
	T a; 
	T b; 
	T hy(T c, T &d);
};

 

在類 A 中聲明了兩個類型為T的成員變量 a 和 b,還聲明了一個返回類型為 T 帶兩個參數類型為 T 的函數 hy。

 

類模板對象的創建:比如一個模板類 A,則使用類模板創建對象的方法為 A m;在類 A 後面跟上一個 <> 尖括號並在裡面填上相應的類型,這樣的話類 A 中凡是用到模板形參的地方都會被 int 所代替。當類模板有兩個模板形參時創建對象的方法為 A m;類型之間用逗號隔開。

 

在類模板外部定義成員函數的方法為:

template<模板形參列表> 函數返回類型 類名<模板形參名>::函數名(參數列表){函數體}


比如有兩個模板形參 T1,T2 的類 A 中含有一個 void h() 函數,則定義該函數的語法為:

 

template class A
{
public: 
	void h();
};

template void A::h()
{
	// ……
}

 

注意:模板的聲明或定義只能在全局,命名空間或類范圍內進行。即不能在局部范圍,函數內進行,比如不能在 main() 函數中聲明或定義一個模板。

 

示例代碼如下:

 

#include 
using namespace std;

template  class Compare //類模板
{
public:
	//Compare(numtype a,numtype b){x=a;y=b;}
	Compare(numtype a,numtype b);
	numtype max(){return (x>y)?x:y;}
	numtype min(){return (x Compare::Compare(numtype a,numtype b)
{
	x=a;
	y=b;
}


int main( )
{
	Comparecmp1(3,7); //定義對象cmp1,用於兩個整數的比較
	cout << cmp1.max() << " is the Maximum" << endl;
	cout << cmp1.min() << " is the Minimum" << endl << endl;
	
	Compare cmp2(45.78,93.6); //定義對象cmp2,用於兩個浮點數的比較
	cout << cmp2.max() << " is the Maximum" < cmp3('a', 'A'); //定義對象cmp3,用於兩個字符的比較
	cout << cmp3.max() << " is the Maximum" <

 

 

運行結果如下:

\

 

本教程示例代碼下載請點此處。

 

參考資料:

 

http://www.cnblogs.com/gw811

http://www.cnblogs.com/gaojun

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved