C++ 除了支持函数模板,还支持类模板(Class Template)。函数模板中定义的类型参数可以用在函数声明和函数定义中,类模板中定义的类型参数可以用在类声明和类实现中。类模板的目的同样是将数据的类型参数化。

声明类模板的语法为:

template<typename 类型参数1 , typename 类型参数2 , …> class 类名{
//TODO:
};

  

类模板和函数模板都是以 template 开头(当然也可以使用 class,目前来讲它们没有任何区别),后跟类型参数;类型参数不能为空,多个类型参数用逗号隔开。

一但声明了类模板,就可以将类型参数用于类的成员函数和成员变量了。换句话说,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。

template<typename T1, typename T2>  //这里不能有分号
class Point{
public:
Point(T1 x, T2 y): m_x(x), m_y(y){ }
public:
T1 getX() const; //获取x坐标
void setX(T1 x); //设置x坐标
T2 getY() const; //获取y坐标
void setY(T2 y); //设置y坐标
private:
T1 m_x; //x坐标
T2 m_y; //y坐标
};

综合示例

 #include <iostream>
using namespace std; template<class T1, class T2> //这里不能有分号
class Point{
public:
Point(T1 x, T2 y): m_x(x), m_y(y){ }
public:
T1 getX() const; //获取x坐标
void setX(T1 x); //设置x坐标
T2 getY() const; //获取y坐标
void setY(T2 y); //设置y坐标
private:
T1 m_x; //x坐标
T2 m_y; //y坐标
}; template<class T1, class T2> //模板头
T1 Point<T1, T2>::getX() const /*函数头*/ {
return m_x;
} template<class T1, class T2>
void Point<T1, T2>::setX(T1 x){
m_x = x;
} template<class T1, class T2>
T2 Point<T1, T2>::getY() const{
return m_y;
} template<class T1, class T2>
void Point<T1, T2>::setY(T2 y){
m_y = y;
} int main(){
Point<int, int> p1(, );
cout<<"x="<<p1.getX()<<", y="<<p1.getY()<<endl; Point<int, char*> p2(, "东经180度");
cout<<"x="<<p2.getX()<<", y="<<p2.getY()<<endl; Point<char*, char*> *p3 = new Point<char*, char*>("东经180度", "北纬210度");
cout<<"x="<<p3->getX()<<", y="<<p3->getY()<<endl; return ;
}

运行结果:

x=, y=
x=, y=东经180度
x=东经180度, y=北纬210度

模板所支持的类型是宽泛的,没有限制的,我们可以使用任意类型来替换,这种编程方式称为泛型编程(Generic Programming)。相应地,可以将参数 T 看做是一个泛型,而将 int、float、string 等看做是一种具体的类型。除了 C++,Java、C#、Pascal(Delphi)也都支持泛型编程。

C++ 模板也是被迫推出的,最直接的动力来源于对数据结构的封装。数据结构关注的是数据的存储,以及存储后如何进行增加、删除、修改和查询操作,它是一门基础性的学科,在实际开发中有着非常广泛的应用。C++ 开发者们希望为线性表、链表、图、树等常见的数据结构都定义一个类,并把它们加入到标准库中,这样以后程序员就不用重复造轮子了,直接拿来使用即可。

C++ 模板有着复杂的语法,可不仅仅是前面两节讲到的那么简单,它的话题可以写一本书。C++ 模板也非常重要,整个标准库几乎都是使用模板来开发的,STL 更是经典之作。

最新文章

  1. SQLCMD备忘录:执行文件夹所有Sql文件
  2. 怎么通过 Mysql 实现数据同步呢?
  3. Shell练习
  4. 在Windows上安装PyCUDA跟Theano
  5. IOS之Core Foundation框架和Cocoa Foundation框架的区别
  6. SSDB
  7. 解决virtualbox 虚拟机不能ping通win7
  8. xcode笔记
  9. Delphi在win7/vista下写注册表等需要管理员权限的解决方案
  10. js substr()与substring()的区别
  11. RedGate 工具SQLMultiScript1.1
  12. crudandroidandroid——CRUD(在上一篇博客的基础上)
  13. 【有意思的BUG】默认置灰的属性的值传递
  14. 向GitHub 提交你的源代码
  15. Log4J2用法
  16. C#中List的方法RemoveAt小测试
  17. [Hinton] Neural Networks for Machine Learning - Basic
  18. leetcode-algorithms-17 Letter Combinations of a Phone Number
  19. 2081.09.22 Kuma(非旋treap)
  20. 15) maven dependency scope

热门文章

  1. Lua unpack函数用法
  2. php中pack、unpack的详细用法
  3. Nginx之编写HTTP模块
  4. LeetCode 10. 正则表达式匹配(Regular Expression Matching)
  5. python 利用python的subprocess模块执行外部命令,获取返回值
  6. 【Java/csv】一个CSV文件解析类(转载)
  7. ShockUtil振动工具类
  8. [Java复习] 多线程&amp;并发 知识点补充
  9. python之scrapy模拟登陆人人网
  10. backbone之module