- 1、本文档共72页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
面向对象程序设计
第六章模板
C++Templates;参考资料;内容;问题提出;函数重载;宏定义;;;模板定义;模板是c++语言最强大却最少被使用的特征之一,便于重复利用已经开发好的数据结构和算法,可以提高代码的复用性和开发效率,是通用编程实现方法之一。
在c++中,模板让程序员能够定义一种使用不同类型对象的行为。比方用模板类定义一种链表,那么通过不同的模板参数〔在调用时提供〕,可以生成不同类型的链表
有点像宏,但是宏不是类型平安的,而模板是类型平安的
分函数模板和类模板两种;6.1函数模板
1、数据类型作为参数的背景
例:求绝对值的函数
intabs(intx)
{
returnx0?-x:x;
}
doubleabs(doublex)
{
returnx0?-x:x;
}
特点:算法完全相同,仅仅只是数据类型不同。
(函数重载)
问题:能否以数据类型作为参数,实现通用代码设计。;2、模板
模板是由可以使用任何数据类型的通用代码构成。模板以数据类型作为参数。
模板的定义形式是:
templatetypename标识符
函数定义
说明:
template是关键字,表示定义的是模板。
括起来的是模板的参数,可以有一个或多个。如:
templateclassT
或者:
templateclassT1,classT2;;分析:
编译器调用abs()时,用其实参的类型推导出函数模板的类型参数。
当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数。
以abs(n)调用为例,编译器将生成一个函数:
intabs(intx)
{
returnx0?-x:x;
};;举例——函数模板;举例1——数组;举例2——矩阵;模板是C++支持参数化的工具
使用类模板使用户可以为类声明一种模式,使类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能够取任意类型。
类模板的声明形式如下:
template模板参数表
类声明
模板参数表为:
class标识符;如:templateclassT
模板参数表包含上面多项内容时,各项内容以逗号分隔。
模板类的成员函数必须是函数模板;在类模板首部以外的成员函数定义都要以下面的形式开头。
templateclassT
与函数模板相同,类模板只有使用的时候才??具体化为某一种类型
用模板类创立对象的一般形式:
模板模板参数表对象名1,对象名2,…,对象名n;
模板参数表为用逗号分隔的假设干类型标识符或常量表达式构成。;#includeiostream.h
#includestdlib.h
//结构体Student
structStudent
{
intid;//学号
floatgpa;//平均分
};
templateclassT//类模板:实现对任意类型数据进行存取
classStore
{
private:
Titem;//item用于存放任意类型的数据
inthaveValue;//haveValue标记item是否已被存入内容
public:
Store(void);//缺省形式〔无形参〕的构造函数
TGetElem(void);//提取数据函数
voidPutElem(Tx);//存入数据函数
};;//以下实现各成员函数。
//注意:模板类的成员函数,假设在类外实现,那么必须是模板函数
//缺省形式构造函数的实现
templateclassT
StoreT::Store(void):haveValue(0)
{}
//提取数据函数的实现
templateclassT
TStoreT::GetElem(void)
{
//如果试图提取未初始化的数据,那么终止程序
if(haveValue==0)
{
coutNoitempresent!endl;
exit(1);
}
returnitem;//返回item中存放的数据
};//存入数据函数的实现
templateclassT
voidStoreT::P
文档评论(0)