c不仅支持函数模板,还支持类模板(Class Template )。 在函数模板中定义的类型参数可用于函数声明和函数定义中,而在类模板中定义的类型参数可用于类声明和类实现中。 类模板的目的是参数化数据类型。
声明类模板的语法如下:
template class类名{
//TODO:
(;
类模板和函数模板都以template开头,后跟类型参数。 当然,也可以使用class。 目前,这些没有区别。 类型参数不能为空。 多个类型参数由逗号分隔。
但是,声明类模板时,可以在类的成员函数和成员变量中使用类型参数。 换句话说,原本使用int、float、char等内置类型的地方,可以用类型参数来替换。
在此定义表示坐标的类时,坐标的数据类型必须是整数、小数或字符串。 例如:
x=10,y=10
x=12.88,y=129.65
x='东经180度',y='北纬210度'
此时可以使用类模板。 请看下面的代码。
template //这里不能有分号
class Point{
公共:
point(T1x,T2 y ) :m_x(x ),m _ y { }
公共:
T1 getX ) ) const; 获取//x坐标
voidSETX(T1X; 设定//x坐标
T2 getY ) ) const; 获取//y坐标
voidsety(T2Y; 设置//y坐标
私有:
T1 m_x; //x坐标
T2 m_y; //y坐标
(;
虽然不确定x和y坐标的数据类型,但类模板允许参数化数据类型,从而消除了定义多个类的需要。
注意:模板标题和类标题是一体化的,可以换行,但不要在中间加分号。
上面的代码只是类的声明,必须在类之外定义成员函数。 在类之外定义成员函数时,必须使用以下格式标记模板标题:
template
返回类型类名:函数名(类型参数列表)。
//TODO:
}
第一行是模板标题,第二行是函数标题,可以放在一行中,但为了便于代码格式,通常分为两行。
然后定义Point类的成员函数。
template //模板标头
T1 Point:getX () const /*函数标头(/
return m_x;
}
template
语音点:3360 setx (t1x ) )。
m_x=x;
}
template
T2 Point:getY () const{
return m_y;
}
template
voidpoint:3360sety(T2Y ) {
m_y=y;
}
除了在template关键字之后指定类型参数外,还应在类名Point之后引用类型参数。 但是,不添加typename关键字。 另外,在类外定义成员函数时,请注意template之后的类型参数必须与类声明时的类型参数匹配。
使用类模板创建对象
在上面的两个代码中定义了类之后,可以使用该类创建对象。 如果使用类模板创建对象,则必须指定特定的数据类型。 请看以下代码:
point P1 (10,20 );
pointp2(10,15.5;
pointp3) 12.4、“东经180度”
与函数模板不同,类模板必须在实例化时显式指定数据类型,编译器无法基于指定的数据推送数据类型。
除了对象变量外,还可以使用对象指针实例化。
point * P1=new point (10.6,109.3 );
Point *p=new Point (东经180度,北纬210度);
请注意,赋值号都表示特定的数据类型,并且必须保持一致。 以下格式是错误的:
//赋值编号两侧的数据类型不一致
point * p=new point (10.6,109 );
//赋值编号的右侧未显示数据类型
point * p=new point (10.6,109 );
综合例
将上述类定义与类实例化的代码集成在一起,完整的示例如下:
#包含
using namespace std;
template //这里不能有分号
class Point{
公共:
point(T1x,T2 y ) :m_x(x ),m _ y { }
公共:
T1 getX ) ) const; 获取//x坐标
voidsetx(T1x; 设定//x坐标
T2 getY ) ) const; 获取//y坐标
voidsety(T2Y; 设置//y坐标
私有:
T1 m_x; //x坐标
T2 m_y; //y坐标
(;
template //模板标头
T1 Point:getX () const /*函数标头(/
return m_x;
}
template
语音点:3360 setx (t1x ) )。
m_x=x;
}
template
T2 Point:getY () const{
return m_y;
}
template
voidpoint:3360sety(T2Y ) {
m_y=y;
}
int main ()。
point P1 (10,20 );
出局
pointp2(10、“东经180度”
出局
Point *p3=new Point (东经180度,北纬210度);
coutgetX () getY ) )。
返回0;
}
执行结果:
x=10,y=20
x=10,y=东经180度
x=东经180度,y=北纬210度
定义类型参数时使用了class而不是typename。 这样做的目的是帮助读者熟悉这两种写法。