C++---多態之模板多態

函數模板使用泛型來定義函數,編譯時具體的類型代替泛型。模板又稱爲通用編程。

如果需要交換兩個int,float型變量,我們可以使用函數重載,如下所示。

#include<iostream>
using namespace std;

void Exchange(int &m,int &n);
void Exchange(float &m,float &n);

int main()
{
	int a=1,b=2;
	Exchange(a,b);
	cout<<"a="<<a<<endl;
	cout<<"b="<<b<<endl; 
	
	float m=1.1,n=2.2;
	Exchange(m,n);
	cout<<"m="<<m<<endl;
	cout<<"n="<<n<<endl; 
		
	return 0;
 } 

 void Exchange(int &m,int &n)
{
	int tem;
	tem=m;
	m=n;
	n=tem;
} 
 void Exchange(float &m,float &n)
{
	float tem;
	tem=m;
	m=n;
	n=tem;
}

上述程序太冗雜,且易出錯;C++允許我們使用泛型編程,對於相同的操作,可以使用函數模板。上述程序使用函數模板後如下:

#include<iostream>
using namespace std;

template<class Type>
void Exchange(Type &m,Type &n);

int main()
{
	int a=1,b=2;
	Exchange(a,b);
	cout<<"a="<<a<<endl;
	cout<<"b="<<b<<endl; 
	
	float m=1.1,n=2.2;
	Exchange(m,n);
	cout<<"m="<<m<<endl;
	cout<<"n="<<n<<endl; 
	
//	float x=1.1;
//	int y=2;
//	Exchange(x,y);  該句無效
//	cout<<"x="<<x<<endl;
//	cout<<"y="<<y<<endl; 
		
	return 0;
 } 
 
 template<class Type> // 此句可替換爲template<typename Type>
void Exchange(Type &m,Type &n)
{
	Type tem;
	tem=m;
	m=n;
	n=tem;
}

模板函數相比上個編程更加簡便,明瞭。

函數模板需要在前面加上語句"template <class T>",也可寫爲"template <typename T>"

class和typename後的形參名可按變量命名規則隨意取名;

在函數模板中,形參類型不是必須爲泛型,可以爲具體類型;void Exchange(Type &m,Type &n,int x)也是一個函數模板;

如果需要多個將同一種算法用於不同類型的函數,適合使用模板

注意:模板並不創建任何函數,只是告訴編譯器如何定義函數;當實參爲int時,int代替所有Type,按模板樣式創建函數。實參爲float時,float代替所有Type,按模板樣式創建函數,最終仍有兩個獨立的函數定義。


模板重載

對兩個數可以使用Exchange函數,但是對於兩個數組,上述模板函數不能對數組內數據進行交換。我們可以使用模板重載。

#include<iostream>
using namespace std;

template<class Type>
void Exchange(Type &m,Type &n);

template<class Type>
void Exchange(Type *m,Type *n,int sum);//sum爲數組內數據量大小 

int main()
{
	int a=1,b=2;
	Exchange(a,b);
	cout<<"a="<<a<<endl;
	cout<<"b="<<b<<endl; 
	
	float m=1.1,n=2.2;
	Exchange(m,n);
	cout<<"m="<<m<<endl;
	cout<<"n="<<n<<endl; 
	
//	float x=1.1;
//	int y=2;
//	Exchange(x,y);
//	cout<<"x="<<x<<endl;
//	cout<<"y="<<y<<endl; 
	int x[6]={0,1,2,3,4,5};
	int y[6]={5,4,3,2,1,0};
	Exchange(x,y,6);
	for(int i=0;i<6;i++)
		cout<<x[i]<<" ";
	cout<<endl;
	
	for(int i=0;i<6;i++)
		cout<<y[i]<<" ";
	cout<<endl;
		
	return 0;
 } 
 
 template<class Type>
void Exchange(Type &m,Type &n)
{
	Type tem;
	tem=m;
	m=n;
	n=tem;
}

template<class Type>
void Exchange(Type *m,Type *n,int sum)
{
	Type tem;
	for(int i=0;i<sum;i++)
	{
		tem=m[i];
		m[i]=n[i];
		n[i]=tem;
	}
 } 

 

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