VC++ 之 第九课 类模版

  这一讲跟大家介绍下类模板。类模板的指导思想跟函数模板类似。

代码复用是面向对象设计中的重要的软件开发思想,对于软件开发效率很是关键。怎样做好代码复用呢?越是通用的代码越好复用,将类型作为参数,这种程序设计类型就是参数化程序设计。模板就是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++有了一些心得,再想想如何用类模板实现代码复用也是可以的。

时间: 2024-08-30 12:06:19

VC++ 之 第九课 类模版的相关文章

【C++探索之旅】第一部分第九课:数组威武,动静合一

内容简介 1.第一部分第九课:数组威武,动静合一 2.第一部分第十课预告:文件读写,海阔凭鱼跃 数组威武,动静合一 上一课<[C++探索之旅]第一部分第八课:传值引用,文件源头>中,我们学习了函数参数的不同传递形式:值传递和引用传递,也学习了如何用头文件和源文件来更好地组织项目. 在不少程序中,我们都需要使用多个相同类型的变量.例如:一个网站的用户名列表(一般是string类型):或者一场比赛的前10个最佳得分(一般是int类型). 类似地,C++和大多数编程语言一样,也有将多个相同类型的数据

【C语言探索之旅】 第一部分第九课:函数

内容简介 1.课程大纲 2.第一部分第九课:函数 3.第一部分第十课预告: 练习题+习作 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文件读写 动

BeagleBone Black板第九课:测试读取ADC数据

BBB板第九课:测试读取ADC数据 之前我们初步学习了GPIO的使用方法,接下来认识下BBB板上ADC数据的读取操作,因为用BBB板做外部控制,接收外部传感器的一些模拟数据,模数转换ADC是需要用到的.所以在这里我也测试一下这BBB板的ADC简单功能,以后有深入学习到知识再进行补充. ADC资源引脚,P9_32至P9_40共九个引脚,其中P9_32为电源正极,P9_34为共地,其他七个对应七个ADC输入脚,因为有一个Ain_7估计是内部使用了,所以我们只使用Ain_0至Ain_6这七个ADC.

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

基于案例SQL优化第九课作业分享

默认统计信息收集: 1. 11g默认启动了统计信息收集的任务,默认运行时间是周一到周五晚上10点和周6,周天的早上6点 2. 你也可以关闭自动统计新收集任务,选择手工收集的方式,但是一般不建议这样操作. 动态统计信息: 1. 统计信息默认情况下是每天晚上10点半后收集,如果新建对象还没来得级收集统计信息,就采用动态采样的方式. 2. 具体在set autotrace 跟踪的执行计划中,可以看到类似:- dynamic sampling used for this statement (level

C++ 类模板二(类模版与友元函数)

//类模版与友元函数 #include<iostream> using namespace std; template<typename T> class Complex{ public: Complex(T a,T b); void Print() const//const修饰的是this指针 { cout << this->Real << ":" <<this->Image<< endl; } /*

浅析在类模版中构建成员函数时,使用memcpy产生的副作用

一般情况下我们在对类模版中的成员函数进行构建时会经常对一些数据进行复制拷贝,而通常情况下我们都不提倡用memcpy进行拷贝,因为在类模版中所传进来的类型可以是内置类型也可以是非内置类型,除非你在成员函数中使用memcpy前进行类型萃取,否则它所带来的副作用的后果也是很可怕的.memcpy在对内置类型可正常拷贝,而在对非内置类型拷贝时会出现浅拷贝的现象. 下面我们可以通过一个简单的顺序表程序来分析memcpy对非内置类型所产生的副作用: #include<iostream> #include&l

Java 第九章 类的方法 (二)笔记

Java 第九章 类的方法 (二) 一.带参的语法:     访问修饰符 返回值类型 方法名称(参数列表){         方法体: }    例:public String getFuirt(String fuirt){    String zhi=fuirt+m+"汁";    return zhi; } 二.调用带参方法:      同类中, (非静态方法),方法名(参数列表):      不同类中,对象.方法名(参数列表): 三.带参方法的参数:     1.形参的数据类型和

NeHe OpenGL教程 第九课:移动图像

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第九课:移动图像 3D空间中移动图像: 你想知道如何在3D空间中移动物体,你想知道如何在屏幕上绘制一个图像,而让图像的背景色变为透明,你希望有一个简单的动画.这一课将教会你所有的一切.前面的课程涵盖了基础的OpenGL,每一课都是在