版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++类模板与函数模板基础详细讲解目录函数模板类模板总结
函数模板
当我们想要定义一个可以支持泛型的函数时,就要采用函数模板的方式了。所谓泛型就是可以支持多种类型的操作,比如我们定义一个compare操作,他可以根据传递给他的参数类型动态调用对应的函数版本,实现多种类型的比较。
templatetypenameT
intcompare(constTv1,constTv2)
if(v1v2)
return-1;
if(v2v1)
return1;
return0;
}
比较函数是一个模板函数,它支持T类型的对象比较,模板函数定义的规则是用template声明模板的类型为T,然后用T做参数即可。
调用的规则传递实参就可以了,前提是实参的类型要支持比较大小,如果是类的类型我们可以重载比较运算符。
intres=compare(3,4);
cout"compare(3,4)resis"resendl;
vectorintv1={1,3,5};
vectorintv2={2,4};
res=compare(v1,v2);
cout"compare(v1,v2)resis"resendl;
我们分别传递了int类型和vector类型的参数作为compare比较的参数。模板函数也支持多个类型,我们可以再定义一个支持多个参数类型的模板函数
templatetypenameT,typenameU
intprintData(constTt,constUu)
cout"tis"tendl;
cout"uis"uendl;
}
调用规则和上边类似,传递两个不同类型即可
printData(3.4,"helloworld");
模板函数也支持非参数类型,用已知类型定义变量
templateunsignedN,unsignedM
intcompareArray(constchar(p1)[N],constchar(p2)[M])
returnstrcmp(p1,p2);
compareArray的模板里用了已知类型unsigned定义了两个变量N和M。
调用的时候N和M会自动根据实参获取值
res=compareArray("hellozack","nicetomeetu");
cout"compareArray("
"hellozack"
",nicetomeetu"
")resis"resendl;
M和N就是传递的两个数组的长度。
类模板
我们实现一个模板类,使其支持类似vector的操作,包括push_back,empty,back,以及pop_back,取索引[]操作等。
//定义模板类型的blob
templatetypenameT
classBlob
public:
typedefTvalue_type;
typedeftypenamestd::vectorT::size_typesize_type;
//构造函数
Blob()
data=make_sharedstd::vectorT();
Blob(std::initializer_listTil)
data=make_sharedstd::vectorT(il);
//for(constTm:il)
//{
//data-push_back(m);
//}
//Blob中元素数目
size_typesize()const{returndata-size();}
boolempty()const{returndata-empty();}
//添加和删除元素
voidpush_back(constTt){data-push_back(t);}
//移动版本的push_back
voidpush_back(constTt){data-push_back(std::move(t));}
//删除元素
voidpop_back();
//元素访问
Tback();
Toperator[](size_typei);
private:
std::shared_ptrstd::vectorTdata;
//校验数据是否有效
voidcheck(size_typei,conststd::stringmsg)const;
};
我们在类外实现check,pop_back,back,以及[]操作。
templatetypenameT
voidBlobT::check(size_typei,conststd::stringmsg)const
if(i=data-size())
throwstd::out_of_range(msg);
templatetypenameT
voidBlobT::pop_back()
if(data-empty())
return;
data-pop_back();
templatetypenameT
TBlobT::back()
returndata-back();
templatetypenameT
TBlobT::operator[](size_typei)
check(i,"indexoutofrange");
return(*data)[i];
}
每一个类的成员函数在类外实现时都要声明template。
类模板的使用如下
voiduse_classtemp()
Blobint
Blobintia2={0,1,2,3,5};
Blobstringia3={"hello","zack","nice"};
for(size_ti=0;iia2.size();i++)
ia2[i]=i*i;
for(size_ti=0;iia2.size();i++)
coutia2[i]endl;
for(size_ti=0;iia3.size();i++)
string_upper(ia3[i]);
for(size_ti=0;iia3.size();i++)
coutia3[i]
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 语文学科核心素养观照下的小学习作教学衔接策略
- 2026三年级数学上册 两位数乘一位数口算
- 2026二年级数学 北师大版儿童乐园时间认识
- 护理感染预防的实践指南
- 打架斗殴责任制度
- 扫黑除恶主体责任制度
- 承销商法律责任制度
- 抗震质量责任制度
- 护路联防部门责任制度
- 指挥中心工作责任制度
- 第一单元《写作:考虑目的和对象》八年级语文下册同步课件(统编版新教材)
- 2025~2026学年新版教科版六年级下册科学教学计划
- 2026上海烟草机械有限责任公司招聘9人笔试参考题库及答案解析
- 2026银行间市场数据报告库(上海)股份有限公司招聘30人笔试参考题库及答案解析
- 2026年吉安幼儿师范高等专科学校单招综合素质考试题库含答案详解(巩固)
- 电梯应急处置预案和应急救援措施方案
- 妇科妇科肿瘤靶向治疗护理
- 2026及未来5年中国凝血酶行业市场供需态势及未来趋势研判报告
- 雨课堂学堂在线学堂云《短视频创意与制作(北京邮电)》单元测试考核答案
- (2026年)心理健康中小学生主题班会课件
- 2024年首都医科大学辅导员招聘考试真题汇编附答案
评论
0/150
提交评论