C++ 共用模板
小编学习了关于C++的公用模板。
两个类或者多个类的功能相同时,仅仅数据类型不同。
class Compare_int
{
public:
Compare(int a, int b)
{x=a;y=b;}
int max( )
{return(x>y)?x:y;}
int min( )
{return(x<y)?x:y;}
private:
int x,y;
};
class Compare_float
{
public:
Compare(float a,float b)
{x=a;y=b;}
float max( )
{return(x>y)?x:y;}
float min( )
{return(x<y)?x:y;}
private:
float x,y;
}
C++提供了一个通用类模板,他可有一个或者多个虚拟对象,对于两个类以上的对象可以申请下面的一个类。
关键字template作为声明
numtype作为虚拟参数
template <class numtype> //声明一个模板,虚拟类型名为 numtype
class Compare //类模板名为 Compare
{
public:
Compare(numtype a, numtype b)
{x=a;y=b;}
numtype max( )
{return (x>y)?x:y;}
numtype min( )
{return (x<y)?x:y;}
private:
numtype x,y;
};
这样就能实现“一类多用”。由于类模板包含类型参数,因此又称为参数化的类。如果说类是对象的抽象,对象是类的实例,则类模板是类的抽象,类是类模板的实例。利用类模板可以建立含各种数据类型的类。在声明了一个类模板后,怎样使用它?怎样使它变成一个实际的类?
必须用实际类型名去取代虚拟的类型,具体的做法是:
Compare <int> cmp(4,7);
即在类模板名之后在尖括号内指定实际的类型名,在进行编译时,编译系统就用int取代类模板中的类型参数numtype,这样就把类模板具体化了,或者说实例化了。这时Compare就相当于前面介绍的Compare_int类。
再模板后的尖括号里面申明的数据类型,在进行编译时,编译系统就用括号中的类型代替 numtype,这样就把模板具体化了。
还有一个问题要说明: 上面列出的类模板中的成员函数是在类模板内定义的。如果改为在类模板外定义,不能用一般定义类成员函数的形式:
numtype Compare::max( ) {…} //不能这样定义类模板中的成员函数。
而应当写成类模板的形式:
template
numtype Compare::max( )
{return (x>y)?x:y;}
类模板的类型参数可以有一个或多个,每个类型前面都必须加class,如
template <class T1,class T2>
class someclass
{…};
今天先介绍这么多。。