类模板

原创 2012年03月22日 16:46:29
类模板的指导思想跟函数模板类似。

       代码复用是面向对象设计中的重要的软件开发思想,对于软件开发效率很是关键。怎样做好代码复用呢?越是通用的代码越好复用,将类型作为参数,这种程序设计类型就是参数化程序设计。模板就是C++进行参数化设计的工具。利用模板我们可以使用同一段程序处理不同类型的对象。

       什么是类模板呢?类模板就是为类声明一种模板,使得类中的某些数据成员,或某些成员函数的参数,又或者是某些成员函数的返回值可以去任意的数据类型,包括基本数据类型和自定义数据类型。

       类模板的声明形式如下:

       template  <模板参数表>
       类声明

       我们看到,在类的声明之前要加上一个模板参数表,模板参数表里的类型名用来说明成员数据和成员函数的类型,等会可以看下面的例子。

       模板参数表中可以以下两种模板参数:

       1.class  标识符(指明可以接受一个类型参数,就是说这是个不固定的类型,用它生成类时才会产生真正的类型)

       2.类型说明符  标识符(指明可以接受一个由“类型说明符”所指定类型的常量作为参数)

       模板参数表可以包含一个或多个以上两种参数,多于一个时各个参数之间用逗号分隔。鸡啄米提醒大家注意的是,类模板的成员函数必须是函数模板。实际上,类模板并不是有实际意义的代码,它只是一些具有相似功能的类的抽象,就是把这些类的共有部分写成模板,类型作为参数,只有用类模板生成类时才会根据需要生成实际的类的代码。

       用类模板建立对象时的声明形式为:

       模板<模板参数表>  对象名1,...,对象名n;

       此处的模板参数表是用逗号分隔开的若干类型标识符或常量表达式构成。它与上面类模板声明时“模板参数表”中的参数是一一对应的。类型标识符与类模板中的“class  标识符”对应,常量表达式与“类型说明符  标识符”对应。这样声明对象之后系统会根据指定的参数类型和常量值生成一个类,然后建立该类的对象。


        鸡啄米最后给大家一个简单明了的例子:

        #include <iostream>
        using namespace std;

        // 定义结构体Student
        struct Student
        {
                  int   id;                 // 学号
                  float average;    // 平均分
        };

        // 类模板,实现对任意类型的数据进行存取
        template <class T>
        class Store
        {
        public:
                 Store(void);              // 默认形式(无形参)的构造函数
                 T GetElem(void);    // 获取数据
                 void PutElem(T x);  // 存入数据
       private:
                 T item;                   // item用来存放任意类型的数据
                 int haveValue;      // 标识item是否被存入数据
       };
       // 以下是成员函数的实现,注意,类模板的成员函数都是函数模板
       // 构造函数的实现
       template <class T>
       Store<T>::Store(void):haveValue(0)
       {
       }
       // 获取数据的函数的实现
       template <class T>
       T Store<T>::GetElem(void)
       {
                 // 若item没有存入数据,则终止程序
                if (haveValue == 0)
               {
                          cout << "item没有存入数据!" << endl;
                          exit(1);
               }
               return item;
       }
       // 存入数据的函数的实现
       template <class T>
       void Store<T>::PutElem(T x)
       {
               haveValue = 1;     // 将其置为1,表示item已经存入数据
               item = x;                // 将x的值存入item
       }

       int _tmain(int argc, _TCHAR* argv[])
       {
                // 声明Student结构体类型变量,并赋初值
               Student g = { 103, 93 };
               // 声明两个Store类的对象,数据成员item为int类型
               Store<int> S1, S2;
               // 声明Store类对象S3,数据成员item为Student结构体类型
               Store<Student> S3;


               S1.PutElem(7);    // 向对象S1中存入数值7
               S2.PutElem(-1);   // 向对象S2中存入数值-1
               // 输出S1和S2的数据成员的值
               cout << S1.GetElem() << "  " << S2.GetElem() << endl;

               S3.PutElem(g);    // 向对象S3中存入Student结构体类型变量g
                // 输出对象S3的数据成员
               cout << "The student id is " << S3.GetElem().id << endl;

               return 0;
        }

       上面这个程序的运行结果是:

       7  -1
       The student id is 103

       类是对对象的抽象,类模板是对类的抽象。鸡啄米最后跟大家说明下,如果觉得类模板太难理解,也没关系,这毕竟不是软件开发中必须用到的东西,等大家对C++有了一些心得,再想想如何用类模板实现代码复用也是可以的。


C++类模板中的模板函数

在C++中类模板中可以嵌套函数模板,但是在使用时候有些注意事项如下: 一、如果类模板中参数为template,在函数模板中,函数的不同模板名字是可以重载的,如template void assign...
  • u010585135
  • u010585135
  • 2015年01月24日 10:05
  • 1190

模板类的继承问题

首先大家来看这段代码: class A { public: void Show() { cout
  • ooooo12345re
  • ooooo12345re
  • 2016年04月22日 12:07
  • 651

C++模板类的使用和继承

定义一个类模板,注意两点: 1,类的定义前面使用关键词:template 2,函数的实现部分,在每个函数名的上一行也要加关键词template , 并且在函数名后面添加,例如 template...
  • taigw
  • taigw
  • 2014年01月14日 10:59
  • 2817

模板类的嵌套

#include using namespace std; template class A{ public: struct B { B(T j): i(j) { } T i...
  • lck32578
  • lck32578
  • 2015年06月08日 15:52
  • 731

【C++】类模板(template)作用对比举例

一、类模板 类模板是后期C++加入的一种可以大大提高编程效率的方法 关键字template 用法 template class T {      //.... }   二、举个栗子 我们要写一个比较...
  • qq_31828515
  • qq_31828515
  • 2016年07月07日 15:44
  • 2209

为什么使用类模板

在前面的几章中,我们主要学习了函数m
  • yincheng01
  • yincheng01
  • 2014年07月23日 16:21
  • 1269

模板类的定义和声明为何要写在一起

转自 前言 常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及B...
  • qianqin_2014
  • qianqin_2014
  • 2016年06月04日 23:45
  • 546

C++ - 类模板(class template)友元(friend) 的 全部六种形式 及 代码

类模板(class template)友元(friend) 的 全部六种形式 及 代码   版权所有, 禁止转载, 如有需要, 请站内联系; 本文地址: http://blog.csdn.net/ca...
  • u012515223
  • u012515223
  • 2013年11月24日 09:31
  • 10121

二叉树的模板类实现

二叉树的定义 二叉树(Binary Tree)是n>0个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两棵不相交的分别被称为左子树和右子树组成。·不存在度大于2的结点; ·左...
  • Avalon_Y
  • Avalon_Y
  • 2016年03月20日 21:25
  • 1472

类模板的简单例子(作业)

#include using namespace std; template class shuju{ public: T data; shuju *next; }; template class...
  • normol
  • normol
  • 2016年04月26日 15:25
  • 781
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类模板
举报原因:
原因补充:

(最多只允许输入30个字)