C++学习34 模板类
C++除了支持模板函数,还支持模板类。模板类的目的同样是将数据类型参数化。
声明模板类的语法为:
template<typename 数据类型参数 , typename 数据类型参数 , …> class 类名{
//TODO:
};
模板类和模板函数都是以 template 开头,后跟数据类型参数列表;数据类型参数不能为空,多个参数用逗号隔开。
一但声明了模板类,就可以用数据类型参数来声明类中的成员变量和成员函数。也就是说,原来使用C++内置类型(比如 int、float、char 等)的地方,都可以用类型参数来代替。
假如我们现在要定义一个类来表示坐标,要求坐标的数据类型可以是整数、小数和字符串,例如:
x = 、y =
x = 12.88、y = 129.65
x = "东京180度"、y = "北纬210度"
这个时候就可以使用模板类,请看下面的代码:
template<typename T1, typename T2> //这里不能有分号
class Point{
private:
T1 x;
T2 y;
public:
Point(T1 _x, T2 _y): x(_x),y(_y){}
T1 getX();
void setX(T1 x);
T2 getY();
void setY(T2 y);
};
坐标 x 和 y 的数据类型不确定,借助模板类,就可以将数据类型参数化,否则就要定义多个类。
注意:模板头和类头是一个整体,可以换行,但是中间不能有分号。
上面是类的声明,还需要在类外定义成员函数。在类外定义成员函数时仍然需要带上模板头,语法为:
template<类型参数列表> 函数返回值类型 类名<类型参数列表>::函数名(参数列表){
//TODO:
}
下面对 Point 类的成员函数进行定义:
template<typename T1, typename T2>
T1 Point<T1, T2>::getX(){
return x;
}
template<typename T1, typename T2>
void Point<T1, T2>::setX(T1 x){
this->x = x;
}
template<typename T1, typename T2>
T2 Point<T1, T2>::getY(){
return y;
}
template<typename T1, typename T2>
void Point<T1, T2>::setY(T2 y){
this->y = y;
}
应当注意:在类外定义成员函数时,template 后面的类型参数列表要与类声明时的一致。
模板类的实例化
实例化模板类时,需要指明数据类型。例如:
Point<int, int> p1(, );
Point<int, float> p2(, 15.5);
Point<float, char*> p3(12.4, "东京180度");
与模板函数不同的是,模板类在实例化时必须显式地指明数据类型,编译器不能根据给定的数据推演出数据类型。下面的实例化代码是错误的:
Point p1(, );
Point p2(10.4, "东京180度");
至此,我们就可以定义模板类并实例化了。
将上面的代码整合起来,给出一个完整的示例:
#include <iostream>
using namespace std;
template<typename T1, typename T2> //这里不能有分号
class Point{
private:
T1 x;
T2 y;
public:
Point(T1 _x, T2 _y): x(_x),y(_y){}
T1 getX();
void setX(T1 x);
T2 getY();
void setY(T2 y);
};
template<typename T1, typename T2>
T1 Point<T1, T2>::getX(){
return x;
}
template<typename T1, typename T2>
void Point<T1, T2>::setX(T1 x){
this->x = x;
}
template<typename T1, typename T2>
T2 Point<T1, T2>::getY(){
return y;
}
template<typename T1, typename T2>
void Point<T1, T2>::setY(T2 y){
this->y = y;
}
int main(){
Point<int, int> p1(, );
cout<<"p1.x="<<p1.getX()<<", p1.y="<<p1.getY()<<endl; Point<int, char*> p2(, "东京180度");
cout<<"p2.x="<<p2.getX()<<", p2.y="<<p2.getY()<<endl; Point<float, float> *p = new Point<float, float>(10.6, 109.3);
cout<<"p->x="<<p->getX()<<", p->y="<<p->getY()<<endl;
return ;
}
注意代码第 44 行,当定义模板类的指针时,赋值号两边都需要指明具体的数据类型,且要保持一致。下面的写法是错误的:
//赋值号两边的数据类型不一致
Point<float, float> *p = new Point<float, int>(10.6, );
//赋值号右边没有指明数据类型
Point<float, float> *p = new Point(10.6, );
C++学习34 模板类的更多相关文章
- 学习C++ 模板类
#include<iostream>#include<typeinfo>#include<cstring> using namespace std; class A ...
- C++学习三 模板类出错总结(Missing template arguments before 'L')
一.模板类的说明 模板类有一个好处是可以放宽你输入的数据类型. 比如有这样的一个函数: int add(int x, int y) { return x+y; } 这个函数对于int类型的x,y才适合 ...
- 读书笔记_Effective_C++_条款四十三:学习处理模板化基类的名称
背景是这样的,有两个不同的公司,然后想设计一个MessageSender,为这两个公司发送不同的消息,既支持明文发送SendClearText,也支持密文发送SendEncryptedText.一种思 ...
- C++学习笔记36:类模板
类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typenam ...
- C++ 模板学习 函数模板、类模板、迭代器模板
使用模板能够极大到使得代码可重用. 记录一下,方便后续使用. 1. 函数模板,支持多种类型参数 #include <stdio.h> #include <math.h> //函 ...
- C++学习笔记(3)----类模板的static成员
与任何其他类相同,类模板可以声明 static 成员: template <typename T> class Foo { public: static std::size_t count ...
- C++学习笔记(2)----类模板和友元
当一个类包含一个友元声明时,类与友元各自是否是模板是相互无关的.如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例.如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定 ...
- QCache 缓存(类似于map的模板类,逻辑意义上的缓存Cache,方便管理,默认类似于LRU的淘汰算法)
最近在学习缓存方面的知识,了解了缓存(Cache)的基本概念,为什么要使用缓存,以及一些缓存算法(缓存替换),如LRU.LFU.ARC等等. 这些缓存算法的实现过程会使用一些基本的数据结构,如list ...
- C++:类模板与模板类
6.3 类模板和模板类 所谓类模板,实际上是建立一个通用类,其数据成员.成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表.使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从 ...
随机推荐
- Linux文件普通权限
1.文件所有者,所属用户组,其他用户1)文件所有者:创建文件的用户2)所属用户组:文件属于哪个用户组3)其他用户:不是文件所有者,不属于文件所属用户组的用户,称为其他用户 2.Linux文件权限我们切 ...
- easyUI之layout
此组件与easyUI中的其它组件加载的方式相同,载为class方式和js方式,但此组件更多的是用class方式,其它的用js方式更为灵活.它继承panel组件及resize组件. 包括多个<di ...
- sed 神器
1. 删除一行 sed -i "1d" sedtest.txt 删除 sedtest.txt 第一行 2. 插入一行 sed '1i\0 ' sedtest.txt &g ...
- SaaS、PaaS和IaaS
•SaaS(软件即服务) •PaaS(平台即服务) •IaaS(基础架构即服务)
- #linux包之psmisc之fuser命令
概述 [root@localhost ~]# rpm -qf /sbin/fuserpsmisc-22.6-15.el6_0.1.x86_64 先说 fuser的作用,fuser能识别出正在对某个文件 ...
- 《中日韩联合开发 - Asianux Server 3》(Asianux Server 3.0)[ISO]
中文名: 中日韩联合开发 - Asianux Server 3英文名: Asianux Server 3.0资源格式: 光盘镜像发行时间: 2007年制作发行: 红旗软件(中国)MiracleLinu ...
- mysql toolkit 用法[备忘] (转)
命令列表 /usr/bin/pt-agent /usr/bin/pt-align /usr/bin/pt-archiver /usr/bin/pt-config-diff /usr/bin/pt-de ...
- jQuery网页右侧固定层显示隐藏在线qq客服代码
CSS代码: @charset "utf-8"; ;;} html,body{font-size:12px;font-family:"微软雅黑";outline ...
- WPF拖到、移动控件
只需2个事件和一个point变量即可: Point mouse_offset = , ); void TC_MouseLeftButtonDown(object sender, MouseButton ...
- SPOJ #692. Fruit Farm
Another palindrome related problem. Actually nothing too theoretical here, but please keep following ...