版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第13章 类模板,类模板是一种对类型进行参数化和实现代码复用的技术。使用类模板可以提高数据的处理效率。本章将详细讲解类模板的有关知识。内容包括类模板的定义和使用、静态成员、友元、特化等内容。由于该内容较抽象,请读者仔细听我讲解。,13.1 什么是类模板,类模板就是类的模板,是对数据的类型进行了参数化处理。类模板实例化的含义如图13-1所示。,图13-1 类模板实例化的含义,说明:类模板所能接受的具体类型参数都是有限制的哦! 在程序中采用类模板的目的如图13-2所示。,图13-2 程序中采用类模板的目的,例如,设计一个栈的类。如果不采用类模板,则在设计之初就要确定栈中数据的类型。如果采用类模板,
2、则只需通过类模板实例化实现。其两种方法如图13-3所示。,图13-3 不采用类模板与采用类模板,图13-3中可以得出,使用类模板的主要优点如图13-4所示。,图13-4 使用类模板的主要优点,提示:类模板是C+语言的一个非常重要的特征,在C+的标准模板库(Standard Template Library,简称STL)中提供了大量的类模板,有关STL的内容将在后面章节中详细讲述。,13.2 定义类模板,定义类模板其实和定义函数的差别不大,其核心都是定义一个算法逻辑。唯一不同的是类模板将其使用的类型进行了参数化,对不同类型的数据用同一算法逻辑。,13.2.1 语法,一个类模板的定义是关键字tem
3、plate作为开始的,其定义的一般语法形式如图13-5所示。,图13-5 类模板定义的一般形式,注意:类模板定义最后的分号不可省,因为与类的定义一样,类模板的定义也是一条语句,需要一个分号作为语句的结束。 定义类模板的成员函数时,有两种方法如图13-6所示。,图13-6 定义类模板的成员函数时的两种方法,在类的外部定义类模板的成员函数时的一般语法形式,如图13-7所示。,图13-7 在类的外部定义类模板的成员函数的一般形式,在定义类模板的数据成员和函数成员时,可以使用模板参数,具体情况如图13-8所示。,图13-8 使用模板参数实例,13.2.2 非类型参数,类模板可以使用非类型参数。非类型的
4、参数通常在模板定义过程中当做常量使用。例如图13-8中的类模板Array的第二个模板参数size即是一个非类型的参数,并且该参数用来设定数组的长度。 声明一个类模板的非类型参数的一般语法形式如图13-9所示。,图13-9 声明一个类模板的非类型参数的一般形式,对于带有非类型参数的类模板,实例化时需要用一个常量来指定这个参数,例如图13-10中的例子。,图13-10 非类型参数实例化,13.2.3 模板参数的默认实参,定义类模板时,可以设定其参数的默认值,即参数的默认实参,包括默认类型参数和默认非类型参数。例如,对于Array模板,设定其默认保存的数据类型为int型,并且其数组尺寸的默认值为10
5、0,如图13-11所示。,图13-11 模板参数的默认实参,13.3 生成类模板的实例,类模板只是一个模板,不是实际的类。使用类模板时必须先实例化,即给类模板参数赋值,包括类型参数和非类型参数。本节将详细讨论如何实例化类模板。,13.3.1 类型参数的模板实例化,实例化类模板时,对于类型参数,可以用C+内建的类型实例化,也可以用自定义的类型。类模板在实例化时没有参数推导机制,所有的模板参数必须指定,除非模板参数带有默认实参。例如,实例化类模板Array,代码如图13-12所示。,图13-12 实例化类模板Array,实例化类模板时,编译器用开发者指定的模板实参代替模板定义中的参数,创建出一种新
6、的“类”实例,即一个类,然后可以用这个新的类去定义类对象。 提示:如果用自定义的类型来实例化一个类模板,则对自定义类型有一定的要求哦! 类模板实例可以当做普通的类使用,其定义的对象与一般类定义的对象在使用上没有什么差别。但要注意的是,类模板只在需要的时候才实例化,如图13-13所示。,图13-13 类模板只在需要的时候才实例化,13.3.2 非类型参数的模板实例化,对于模板的非类型参数,在实例化时只要指定其实参即可。但要注意的是,这个实参必须是一个常量。如图13-14中的代码,进行比较。,图13-14 非类型参数的模板实例化,13.3.3 类模板示例,在实际开发中,类模板经常用做一个可以处理各
7、种类型数据的容器。比如一个先入后出的栈,如果将栈定义成一个类模板,则可以用来处理各种数据,方便使用。,【示例13-1】,下面程序定义一个Stack类模板,其模板参数有类型参数和非类型参数,并用这个类模板来处理不同类型的数据,实现代码及结果如图13-15所示。,图13-15 类模板实例,图13-15的代码中声明一个类模板Stack,成员函数push()和pop()分别用来向类中添加元素和弹出元素。在main()函数对类模板Stack进行实例化并创建对象,然后调用成员函数进行栈的相关操作。,13.4 类模板的静态成员,与普通类一样,模板也可以有自己的静态成员。不同的是,每种类型的类模板的实例有自己
8、的一组静态成员。与普通类的静态成员初始化一样,类模板的静态成员也需要类内声明,在类外定义。其在类外定义的一般形式如图13-16所示。,图13-16 在类外定义类模板的静态成员的一般形式,【示例13-2】,下面是坦克计数程序,类模板CTankManager用不同类型的Tank来实例化,并统计这种类型tank的数量,其现代码及结果如图13-17所示。,图13-17 类模板的静态成员实例,程序中的CTankManager是一个管理类,用来管理放在其中的tank,其中的siCount是坦克的计数器,每种类型的坦克都有其自己的计数器。CT91、CT20、CT21是具体的坦克类型。,13.5 类模板的友元
9、,类模板的友元和普通类的友元一样,使其友元类或友元函数拥有存取的特权,即可以访问到类中的私有或保护的数据成员和成员函数。有三种友元可以出现在类模板中,13-18所示。,图13-18 可以出现在类模板中的友元,13.5.1 非模板的友元类和友元函数,类模板可以接受一个非模板的类或者函数作为友元。对于这种友元类和友元函数,不需要在声明友元前声明,原因如图13-19所示。,图13-19 不需要在声明友元前声明友元类和友元函数的原因,但要把类成员函数声明为友元,则前面必须有类的定义(注意不是声明,是定义),因为一个类成员只能由该类的定义引入 。例如,图13-20中的代码,是在类模板中声明一个友元类和友
10、元函数。,图13-20 类模板中声明一个友元类和友元函数,13.5.2 与模板参数不绑定的友元类和友元函数模板,类模板的友元可以是类模板或函数模板的实例。如果后者的模板实参与前者的模板参数没有任何关系,也就是说友元模板与类模板的参数不绑定,则在声明友元前不需要提前声明。其原因同使用非模板的友元一样。,图13-21 类模板中声明与模板参数不绑定的友元类和友元函数模板,13.5.3 与模板参数绑定的友元类和友元函数模板,如果类模板的友元是类模板或者函数模板的实例,而且其模板实参就是类模板的参数,则友元模板必须提前声明。 例如,图13-22中的代码,是在类模板中声明与模板参数绑定的友元类和友元函数模
11、板。,图13-22 类模板中声明与模板参数绑定的友元类和友元函数模板,13.6 类模板的特化,有时某些类型不能直接用来实例化类模板,或者说直接实例化不能满足需要,此时就要针对这种类型进行特化,包括完全特化和偏特化。,13.6.1 类模板的全特化,类模板的特化是为了针对特殊的类型,进行特殊的处理。例如,图13-23中为Stack类模板添加返回最大值的max()函数。,图13-23 类模板的全特化,13.6.2 类模板的偏特化,类模板的偏特化是指需要根据模板的某些参数但不是全部的参数进行特化。 例如,一个Dot类,其模板参数列表里面有两个参数x和y。假如要求对在y坐标等于80的点进行一些特别处理。这时就需要对模板参数的y进行常量化,如图13-24所示。,图13-24 模板参数的y进行常量化,部分特化的模板实参表只列出那些模板实参仍然未知的参数。如图13-25是一个偏特化Stack类的示例。,图13-25 类模板的偏特化,13.6.3 类模板的匹配规则,类模板的匹配规则遵循“特化程度最高”
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川农业大学《文学概论(一)》2024-2025学年第二学期期末试卷
- 2026河南新乡市慧中大数据中等专业学校招聘笔试备考题库及答案解析
- 2026年山东大学教师外其他专业技术岗位招聘(14人)笔试参考题库及答案解析
- 2026重庆荣昌区市场监督管理局招聘1人笔试备考题库及答案解析
- 2026中国聚变能源有限公司春季校园招聘笔试模拟试题及答案解析
- 2026东风汽车集团股份有限公司经营管理部、营销管理部招聘7人考试参考试题及答案解析
- 2026文化和旅游部直属事业单位招聘52人笔试备考试题及答案解析
- 律所内部业务审核制度
- 企事业单位内部门卫制度
- aeo认证内部审计制度
- 微医商业计划书
- 交通事故误工时间证明样本
- 人才招聘选拔多维度评分模型参考模板
- 2026年苏州卫生职业技术学院单招职业技能测试题库必考题
- 游泳馆安全生产岗位责任制
- 铁路危险货物培训
- 2025金融数据安全治理白皮书
- 2025年体育教育专升本真题解析试卷(含答案)
- 钢板桩围堰专项施工方案
- 服务心理学(第四版)课件 项目二 任务二 走进服务心理学
- 南宁市可再生能源建筑应用技术指南
评论
0/150
提交评论