C++模板

来源:互联网 发布:collator java 编辑:程序博客网 时间:2024/05/21 09:51

忆十整理:C++知识点3(模板)

/***************忆十代码***************/

1、模版函数:

       注:A、模板类型并不具有隐式类型转换;

              B、如果用到的T实例化成类类型,那么对运算符的处理方面应当进行重载;

              C、函数模板亦可重载;

       格式:

template 函数形参表

       返回值 函数名(形参表)

       {

              函数体;

}

示例1:

template<class T>          //这里也可以用typename代替calss

T min(T x,T y)

{

       return ((x>y)?x:y);

}

示例2:

/***************忆十代码***************/

#include<iostream.h>

class MyClass

{

       int x,y;

public:

       MyClass(int x,int y)    //构造函数

       {

              this->x=x;

              this->y=y;

       }

       int getx(){return x;}

       int gety(){return y;}

       int operator < (MyClass &c);

};

intMyClass::operator <(MyClass &c)      //定义重载“<”运算符

{

       if(x<c.x && y<c.y)

              return 1;

       else

              return 0;

}

template<class T>         //函数模板声明

T &Min(T&o1,T &o2)

{

       if(o1<o2)             //若被实例化为类类型,则对<进行重载,否则使用标准<运算符

              return o1;

       return o2;

}

void main()

{

       MyClass s1(5,11);

       MyClass s2(6,18);

       MyClass s3=Min(s1,s2);   //重载运算符重载

       cout<<"最小的坐标:("<<s3.getx()<<","<<s3.gety()<<")"<<endl;

       double d1=2.35;

       double d2=5.3;

       cout<<"较小的数:"<<Min(d1,d2)<<endl;   //一般比较

}

/***************忆十代码***************/

2、类模板:

       格式:

              Template类型形参表

              Class类名

{

       类声明体;

};

Template 类型形参表

返回值类型 类名 类型名表::成员函数(形参表)

{

       成员函数定义体;

}

       注意:当类模板的成员函数在外部实现时也要加上“template 类型形参表”

示例1(类模板简单应用):

/***************忆十代码***************/

#include <iostream.h>

template <class T>

class Array

{

       intsize;

       T*aptr;       //T为类型参数

public:

       Array(intslots=1)

       {

              size=slots;

              aptr=newT[slots];      //为动态数组分配内存空间

       }

       voidfill_Array();

       voiddisp_Array();

       ~Array()

       {

              delete[] aptr;

       }

};

template <class T>                //注意这里,勿忘

void Array<T>::fill_Array()       //总是忘记格式

{

       cout<<"(输入"<<size<<"个数据)"<<endl;

       for(inti=0;i<size;i++)

       {

              cout<<"第"<<i+1<<"个数据:";

              cin>>aptr[i];

       }

}

template <class T>

void Array<T>::disp_Array()

{

       for(inti=0;i<size;i++)

              cout<<aptr[i]<<"";

       cout<<endl;

}

void main()

{

       Array<char>ac(5);    //Array<char>为模板类,ac(5)定义模板类的实例对象

       cout<<"填充一个字符数组";

       ac.fill_Array();

       cout<<"数组的内容是:";

       ac.disp_Array();

       Array<double>ad(3);

       cout<<"填充一个双精度的数组:"<<endl;

       ad.fill_Array();

       cout<<"数组的内容是:";

       ad.disp_Array();

}

/***************忆十代码***************/

示例2(类模板作为函数参数):

void fun(MyClass<T> x)   //类模板作为函数参数

{

       cout<<x.abs()<<endl;

}

示例3(类模板作为友元函数的形参类型):

template <class T>     //类的成员函数的外部定义

MyClass<T> operator+(MyClass<T> m1,MyClass<T> m2)

{

       MyClass<T>tmp;  //这里都要用到MyClass<T>

       tmp.x=s1.x+s2.x;

       returntmp;

}

示例4(类模板与静态成员):

#include <iostream.h>

template <class T>

class A

{

       Tm;

       staticT n;

public:

       A(Ta):m(a){n+=m;}

       voiddisp()

       {

              cout<<"m="<<m<<",n="<<n<<endl;

       }

};

template <class T>

T A<T>::n=0;       //静态数据初始化

void main()

{

       A<int>a(2),b(3);  //每一个实例化的类型分配一个静态成员

       a.disp();

       b.disp();

       A<double>c(1.2),d(4.6);

       c.disp();

       d.disp();

}

/***************忆十代码***************/

原创粉丝点击