模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

由于类模板包含类型参数,因此又称为参数化的类。如果说类是对象的抽象,对象是类的实例,则类模板是类的抽象,类是类模板的实例。

1.模板的概念

模板定义

函数模板:template <typename T> T fun_name(const T&, const T&);

类模板:template <typename T> class class_name {

    public:

      T t;

      void test(const T& t);

    }

模板规则

类模板作用域在模板定义的整个过程

类模板不能重复

可以只声明,不定义

  形参必需带上typename 或者 class

实例化

int a = fun_name(3, 4);

class_name<int> c1;

实例化时机在函数调用或者类实例构建时实例化模板

函数模板的一般定义形式是:

template<类型形式参数表> 返回类型 FunctionName(形式参数表)
{
//函数定义体
}

其中的类型形式参数表可以包含基本数据类型,也可以包含类类型。如果是类类型,则需加前缀class。

类模板的一般说明形式是:

template<类型形式参数表> class className
{
//类声明体
}; template<类型形式参数表>
返回类型 className<类型名表>::MemberFuncName1(形式参数表)
{
//成员函数定义体
} template<类型形式参数表>
返回类型 className<类型名表>::MemberFuncName2(形式参数表)
{
//成员函数定义体
} ... template<类型形式参数表>
返回类型 className<类型名表>::MemberFuncNameN(形式参数表)
{
//成员函数定义体
}

其中的类型形式参数表与函数模板中的意义一样。后面的成员函数定义中,className<类型名表>中的类型名表,是类型形式参数的使用。

2.函数模板与模板函数的区别

  • 函数模板是模板的定义,定义中用到通用类型参数。
  • 模板函数是实实在在的函数定义,它由编译系统在碰见具体的函数调用时所生成,具有程序代码。

3.类模板和模板类的区别

  • 类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数。
  • 模板类是实实在在的类定义,是类模板的实例化。类定义中参数被实际类型所代替。

与类和函数的定义不同,类模板和函数模板的定义一般放在头文件中。

使用类模板的方法为

  1. 在程序开始的头文件中说明类模板的定义。
  2. 在适当的地方创建一个模板类的实例,即一个实实在在的类定义,同时创建该模板类的对象。
  3. 有了对象名,以后的使用就和通常一样。但要记住,你规定了什么类型的模板类,在使用成员函数时,所赋的实参也要对应该类型。

归纳的介绍,可以这样声明和使用类模板:

  1. 先写出一个实际的类。由于其语义明确,含义清楚,一般不会出错。
  2. 将此类中准备改变的类型名(如int要改变为float或char)改用一个自己指定的虚拟类型名(如上例中的numtype)。
  3. 在类声明前面加入一行,格式为
    template <class 虚拟类型参数>,如
    template <class numtype> //注意本行末尾无分号
    class Compare
    {…}; //类体
  4. 用类模板定义对象时用以下形式:
       类模板名<实际类型名> 对象名;
       类模板名<实际类型名> 对象名(实参表列);

       Compare<int> cmp;
       Compare<int> cmp(3,7);
  5. 如果在类模板外定义成员函数,应写成类模板形式:
       template <class 虚拟类型参数>
       函数类型 类模板名<虚拟类型参数>::成员函数名(函数形参表列) {…}

关于类模板的几点说明:

    1. 类模板的类型参数可以有一个或多个,每个类型前面都必须加class,如
      template <class T1,class T2>
      class someclass
      {…};
      在定义对象时分别代入实际的类型名,如
         someclass<int,double> obj;
    2. 和使用类一样,使用类模板时要注意其作用域,只能在其有效作用域内用它定义对象。
    3. 模板可以有层次,一个类模板可以作为基类,派生出派生模板类。

C++模板知识小结的更多相关文章

  1. C++ STL 知识小结

    qwq...接近联赛,就在这里对STL做一点知识小结吧,因为STL曾经失分很多. 简介 (来自Baidu) STL是Standard Template Library的简称,中文名标准模板库,惠普实验 ...

  2. Android app开发知识小结

    Android知识小结 这是一个知识的总结,所以没有详解的讲解. 一.分辨率Android中dp长度.sp字体使用.px像素.in英寸.pt英寸1/72.mm毫米 了解dp首先要知道density,d ...

  3. C/C++ 位域知识小结

    C/C++ 位域知识小结 几篇较全面的位域相关的文章: http://www.uplook.cn/blog/9/93362/ C/C++位域(Bit-fields)之我见 C中的位域与大小端问题 内存 ...

  4. JAVA 变量 数据类型 运算符 知识小结

    ---------------------------------------------------> JAVA 变量 数据类型 运算符 知识小结 <------------------ ...

  5. html5-基本知识小结及补充

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  6. HTTPS知识小结

    HTTPS知识小结 背景1:TCP握手 internet上的两台机器A,B要建立起HTTP连接了,在这之前要先建立TCP连接,情景大概是这样子的: A:你好,我跟你建立一个TCP好吗? B:好啊. A ...

  7. shell 环境变量的知识小结

    环境变量的知识小结:·变量名通常要大写.·变量可以在自身的Shell及子Shell中使用.·常用export来定义环境变量.·执行env默认可以显示所有的环境变量名称及对应的值.·输出时用“$变量名” ...

  8. 180531-Spring中JavaConfig知识小结

    原文链接:Spring中JavaConfig知识小结/ Sring中JavaConfig使用姿势 去掉xml的配置方式,改成用Java来配置,最常见的就是将xml中的 bean定义, scanner包 ...

  9. javascript之正则表达式基础知识小结

    javascript之正则表达式基础知识小结,对于学习正则表达式的朋友是个不错的基础入门资料.   元字符 ^ $ . * + ? = ! : | \ / ( ) [ ] { } 在使用这些符号时需要 ...

随机推荐

  1. android 使用静态变量传递数据

    使用静态变量传递数据之通用方式. 测试应用:当前页面点击button传递数据到一个新的页面显示在textview中. 首先在,mainActivity.xml文件中加入一个button按钮 <B ...

  2. 解决JVM最大内存设置问题

    这里和大家讨论一下如何获得JVM最大内存,在命令行下用java-XmxXXXXM-version命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息. ...

  3. WebBrowser控件应用:弹出新窗体和关闭窗口

    缘起:上次写了一个<WebBrowser控件的简单应用2>,提到了在NewWindow事件中打开新窗口的例子.有网友“队长 ”提出那个事件得到的参数是本页面的,而不是新页面的,经过测试,果 ...

  4. python 细枝末节

    1. print  自动换行 看区别 >>> for i in range(4): ... print i ... 0 1 2 3 >>> for i in ran ...

  5. python多线程threading

    本文通过 4个example 介绍python中多线程package —— threading的常用用法, 包括调用多线程, 同步队列类Queue, Ctrl+c结束多线程. example1. 调用 ...

  6. SPA与DPA 攻击【转】

    转自:http://blog.sina.com.cn/s/blog_6cb58dbf0102v7ym.html SPA SPA是一种直接解释能量消耗测定值的技术.系统消耗能量的大小随微处理器执行的指令 ...

  7. Asp.net Json 解析 与 直接用ip访问返回josn

    数据分析 目前手头上需要制作一个天气预报功能,现成的接口已经有了.我随便输入一个城市,然后出现了如下的信息: {"wdata":{"cityName":&quo ...

  8. hihoCoder 1039字符消除 (字符串处理)

    http://hihocoder.com/problemset/problem/1039 因为字符串只由3种字母组成,并且插入的字符也只能是这三种字符的其中一个,那么可以考虑枚举这三个字符其中一个字符 ...

  9. javascript高级编程运用

    一//各种尺寸 (size) s += “\r\n网页可见区域宽:“+ document.body.clientWidth; s += “\r\n网页可见区域高:“+ document.body.cl ...

  10. 1427. SMS(DP)

    1427 题意不太好理解 其它没什么 细心啊 细心 一个0写成了1 WA半天 以每个字符是以第一种方式还是第二种方式来D #include <iostream> #include<c ...