前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++模板知识小结

C++模板知识小结

作者头像
猿人谷
发布2018-01-17 09:27:49
4740
发布2018-01-17 09:27:49
举报
文章被收录于专栏:猿人谷猿人谷
代码语言:javascript
复制
模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

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

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;

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

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

代码语言:javascript
复制
template<类型形式参数表> 返回类型 FunctionName(形式参数表)
{
    //函数定义体
}

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

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

代码语言:javascript
复制
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. 模板可以有层次,一个类模板可以作为基类,派生出派生模板类。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-08-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.模板的概念
  • 模板定义
  • 模板规则
  • 实例化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档