【轻敲stl的大门】函数模板和类模板
创始人
2024-03-30 20:58:13
0

image-20221024160250226

文章目录

  • 泛型编程---模板
  • 函数模板
  • 类模板
      • 最后我在这里祝各位佬10.24程序员节快乐呀~~

(可以不看)背景

某一天你的老板叫你把几个数据交换一下,其中有整数、小数,名字等等。于是你开始码字,不一会功夫就做完了一个整形的和浮点型交换函数。

image-20221023184024368

于是你想把代码实现给老板看看反向有没有问题,老板看完后咔咔给你几个大嘴巴子说:“这个太麻烦拉,我还要用眼睛去看小数和整数来区分的使用函数接口,那如果是小数和和整数,名字交换呢?那是不是又得加一个接口?那我还需要你干嘛?我自己去excel表上搞算了!

这时候你慌了,你被老板批评得找不着北了。这时候就需要函数模板又或者是类模板上场拉!

泛型编程—模板

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

image-20221023185525157

函数模板

语法:template< typename T>

{template-模板关键字关键字typename-(或者是class但不能用struct)定义模板参数关键字

T:自定义模板的名字}

1.函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

2.它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。(编译器化身打工人,我则是懒狗)

3.在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

4.用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化

隐式实例化:让编译器根据实参推演模板参数的实际类型

image-20221023190637941

 templatevoid swap(S& x, S& y){S tmp = x;x = y;y = tmp;}int main(){int a = 5, b = 7;double c = 3.40, d = 5.20;swap(a, b);swap(c, d);//swap(a, d);---错误实例//为什么不能让int类型和double类型互换?推演模板实例化在调用参数之前,这时候推演模板实例化模板参数(S)只有一个,出现两个参数类型编译器不知道要推演哪一个则会报错;这时候还轮不到调用参数的隐式转化(整形提升-数据截断等等);// 就算是发生参数的隐式类型转化,参数a会先拷贝出一份临时变量然后再传给函数进行调用参数x-临时变量具有常性,那么参数x要加const,但参数x引用加const又怎么交换呢?return 0;}

那么当出现两种参数类型时,我们应该怎么做呢?

这里有三种解决方案。

1.强制转化(显示类型转化)

image-20221024144320417

2.显示实例化

语法:函数< 要显示实例化的参数类型>(参数1,参数2…)

image-20221024145054549

3.多个参数模板

image-20221024145908493

另:函数模板和相同函数可以同时存在吗?可以!

但是我们通过调试发现当出现相同类型的函数和函数模板时编译器会优先选择函数!(得出结论函数也是懒狗)

image-20221024150623607

而且调用模板的地址是相同的!看具体满足的需求来优先调用函数还是函数模板!

image-20221024155501212

类模板

类模板一般显示实例化

1.类模板自定义格式:template

2.类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类

比如:Stack-类名;Stack< int >-类型

image-20221024154325752

这里贴一份代码强化理解

template
class Stack
{
public:Stack(int capacity = 4)//构造函数{cout << "Stack(int capacity = )" << capacity << endl;_a = (T*)malloc(sizeof(T) * capacity);if (_a == nullptr){perror("malloc fail");exit(-1);}_top = 0;_capacity = capacity;}~Stack()//析构函数{cout << "~Stack()" << endl;free(_a);_a = nullptr;_top = _capacity = 0;}void Push(T x){// ....// 扩容_a[_top++] = x;}private:T* _a;int _top;int _capacity;
};

最后我在这里祝各位佬10.24程序员节快乐呀~~

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...