找回密码
 会员注册
查看: 32|回复: 0

模板初阶(详解)

[复制链接]

11

主题

0

回帖

34

积分

新手上路

积分
34
发表于 2024-9-12 16:36:52 | 显示全部楼层 |阅读模式
一、泛型编程为了引出模板,我们来看下面代码,比如要实现不同类型的交换函数,如下:voidSwap(int&a,int&b){ intc=a; a=b; b=c;}voidSwap(char&a,char&b){ charc=a; a=b; b=c;}voidSwap(double&a,double&b){ doublec=a; a=b; b=c;}        这样每个类型交换都需要写一个函数重载,其中代码的重复率很高,只有类型不同而逻辑都一样,写起来也非常的繁琐,那我们能不能写一个通用的函数告诉编译器一个模版让编译器根据不同的类型利用该模版来生成代码呢?这就是本章的主题——模板。泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。模板分为函数模板和类模板,接下来我们分别来详细学习。二、函数模版函数模板的格式:template返回类型函数名(参数列表){}注意:这里typename可以换为calss,但不能换位struct。代码示例:templatevoidSwap(T&a,T&b){ Tc=a; a=b; b=c;}        这样我们写一个模板就可以省了很多代码,还增加可读性。以上并不是一个函数只是一个模板,需要等到使用这个函数的时候编译器会具体的实例化出对应类型的函数,它和写多个函数重载并没有本质区别,只是说这个工作让编译器帮我们做了而已,在效率上并没有提升。        需要注意的是如果在这里传两个不同的参数的话会编译报错,因为这里模板参数只有一个,而传入两个不同的类型的实参的时候,编译器并不会帮你强制类型转换,因为它并不知道转成那个类型出了问题它可不背锅。那么我们硬要传两个不同的参数的话,可以显示的强制类型转换成两个相同类型,或者调用的时候在函数名后面加,尖括号里面加类型名,也就是显示实例化,如下示例:        这里有人可能会试图去测试Swap模板,结构还是编不过,这是因为不符合引用的语法,我在之前讲过,如下链接:C++入门基础-CSDN博客        对于这种情况,我们可以在外面进行强制类型转换存入新的变量里面然后再把新的变量代替原来变量做函数参数。         函数模板与模板函数的区别:通过这两个词就可以看出来函数模板的主语是模板,模板函数的主语是函数,那么接下来就好理解了,函数模板就是一个模板如刚才我们写的那些都是函数模板,而模板函数是函数模板经过实例化后生成的函数。三、类模板类模板的定义个格式:templateclass类模板名{}同样这里typename可以换为calss,但不能换位struct。        对于类模板与函数模板不同,类模板在使用的时候必须显示实例化,在类模板名后面加尖括号里面放入类型名。注意:类模板不是类,要经过实例化后才是类。如下一个Stack类模板的部分://类模版templateclassStack{public: Stack(size_tcapacity=4) { _array=newT[capacity]; _capacity=capacity; _size=0; } voidPush(constT&data); //......private: T*_array; size_t_capacity; size_t_size;};//模版不建议声明和定义分离到两个文件.h和.cpp会出现链接错误templatevoidStack:ush(constT&data){ //扩容 //...... _array[_size]=data; ++_size;}intmain(){ Stackst1; Stackst2; return0;}四、模板参数的匹配原则接下来讲的匹配原则对于类模板和函数模板都是相同的,我们就以函数模板为例。一个非模板函数是可以和模板函数同名的,而怎么区分编译器会调用那个呢,如下:templateTAdd(Ta,Tb){ returna+b;}intAdd(inta,intb){ returna+b;}intmain(){ inta1=2,b1=4; doublea2=2.5,b2=1.5; intret1=Add(a1,b1); doubleret2=Add(a2,b2); return0;}        编译器在做调用(不仅指函数的调用)的时候有一个特点,有现成的就调现成的,没现成的就调用模板实例化一个。如这里第一个Add调用的是非模板函数,第二个Add调用的是模板函数。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-27 02:08 , Processed in 0.417329 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表