c++之模板

c++之模板

引入模板的作用:避免代碼的重複,編寫脫離數據類型的通用模板。模板是對類型進行參數化的工具,是c++中支持參數化多態的工具。

模板的分類:函數模板、類模板

下面依次介紹函數模板和類模板。

函數模板:
template <class T> or template <typename T>  //模板聲明格式
返回值類型 函數名(模板形參表) 
{
	函數體
}

函數調用:
函數名(模板實參表) //和普通的函數調用沒有區別,只不過運行時,系統會首先根據參數類型確定數據類型,生成一個模板函數</span>

下面介紹一個使用函數模板的實例
template <typename T>
 T square(T x)// template 語句 和 函數模板定義語句不允許有別的語句
{
   T result;
   result = x * x;
   return result;
};

void main()
{
   int    i, ii;
   float  x, xx;
   double y, yy;

   i = 2;
   x = 2.2;
   y = 2.2;

   ii = square<int>(i);
   cout << i << ": " << ii << endl;

   xx = square<float>(x);
   cout << x << ": " << xx << endl;

   yy = square<double>(y);// 顯式使用模板
   cout << y << ": " << yy << endl;

   yy = square(y);//隱式使用模板
   cout << y << ": " << yy << endl;

   return ;
}
    

注意:
     1)模板函數調用時,可以有顯式和隱式的調用。
   2)模板聲明格式包含以下兩種:template <class T> or template<typename T>
   3)模板的聲明和定義必須在同一個文件中,如頭文件。
  4)在模板函數的定義中,T代表數據類型。
  5)c語言的宏定義也可以實現函數模板的功能,如#define  f(x)   ((x)*(x)) 但是宏定義沒有類型檢查,函數模板有類型檢查。

模板函數運行過程分爲兩部分:1)傳遞參數類型,用模板實參將類型參數T進行實例化。2)傳遞參數,將參數傳遞給函數。

函數模板使用過程中,出現的一些特殊的情況
1)函數模板可以使用多個模板參數,有幾個不同的類型,就用不同的模板參數來代表它。
template <class T,class D>
T max(T a,D b)
{
	return (a>b)?a:b;
}

void main()
{
	float a = 4.5;
	int b = 100;
	cout<<max(100,154.5)<<endl;
	cout<<max(154.5,100)<<endl;
}
2)重載一個函數模板:定義一個模板後,再定義一個重載函數

template <class T>
T maxim(T a,T b)
{
	return (a>b)?a:b;
}
int maxim(int a ,int b)
{
	return (a>b)?a:b;
}//用戶自己定義一個同名函數

void main()
{
	int m,n;
	m = 10;
	n = 20;
	char a = 'a',b = 'b';
	char s[10];
	cout<< maxim(m,n)<<endl;//調用函數 實參和函數的參數類型完全一致,直接調用函數
        cout<<maxim(a,b)<<endl;//調用模板 實參和函數參數類型不同,直接調用模板
        cout<<maxim(m,a)<<endl;//調用函數 實參的類型不同,模板不適合,則再次調用函數
        cout<<maxim(m,s)<<endl;//報錯-函數也不適合,直接報錯
}
上面調用函數的順序是,先調用函數-其次調用模板函數-再次調用函數。最後如果都不能調用,就直接報錯






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