一.模板类(和类模板一样?)
先看一个正确的例子
#include <iostream> using namespace std; template <class T> class MyType { public: MyType(){t=0;} MyType (T ta){t=ta;} T getValue(); MyType operator+(MyType mt1){ MyType mt; mt.t=t+mt1.t; return mt;} private: T t; }; template <class T> T MyType<T>::getValue() { return t; } int main() { MyType<int> s1(10),s2(-5),s3; MyType<double> s4(10.3),s5(5.2),s6; s3=s1+(s2); s6=s4+(s5); cout<<"s1.getValue="<<s1.getValue()<<",s2.getValue="<<s2.getValue()<<",s3.getValue="<<s3.getValue()<<endl; cout<<"s4.getValue="<<s4.getValue()<<",s5.getValue="<<s5.getValue()<<",s6.getValue="<<s6.getValue()<<endl; system("pause"); return 0; }
还有一个正确的例子
#include <iostream> using namespace std; template <class T> class A { public: A(); A(T _a,T _b); T sum(); private: T a; T b; }; template<class T> A<T>::A(){a=0;b=0;} template<class T> A<T>::A(T _a,T _b){a=_a;b=_b;} template<class T> T A<T>::sum(){return (a+b);} void main() { A <int> ai(3,4); A<double> ad(3.1,4.0); cout<<ai.sum()<<" "<<ad.sum()<<endl; }
注意区分返回值或者参数值等何时为T,合适为类名(例1是MyType,例2是A)比如我常犯的错
例1中的
MyType operator+(MyType mt1){ MyType mt; mt.t=t+mt1.t; return mt;}
我常会搞混
T operator+(T t1){return (t+t1);}
理论上、语法上也对着,但是main函数中我需要这样调用的
s3=s1+s2;
二.函数模板
在函数中为了针对不同类型数据实现相同功能,通常可能会采用函数重载的功能来实现。例如实现找出两个数中较大的数
//函数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 ;}
这样的方法比较冗余而且局限,定义了几种就只能用这几个类型。
引入模板函数
函数模板的一般形式如下:
Template <class或者也可以用typename T>
返回类型 函数名(形参表)
{//函数定义体 }
说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.
例如:
#include <iostream> using std::cout; using std::endl; //声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替, //T可以被任何字母或者数字代替。 template <class T> T min(T x,T y) { return(x<y)?x:y;} void main( ) { int n1=2,n2=10; double d1=1.5,d2=5.6; cout<< "较小整数:"<<min(n1,n2)<<endl; cout<< "较小实数:"<<min(d1,d2)<<endl; system("PAUSE"); }
三 非类型模版参数
一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。
那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。
template<typename T, int MAXSIZE>
class Stack{
Private:
T elems[MAXSIZE]; … }; Int main() { Stack<int, 20> int20Stack; Stack<int, 40> int40Stack; … };