深入学习cpp初阶模板

深入学习cpp初阶模板

前言:

前面我们学习了cpp的内存管理,这一节我们来了解cpp模板的魅力话不多说,直接步入本篇文章的内容

正文:

在c语言中我们会遇到一个相似的函数,只因为参数的不同就需要在单独写一个函数,当然在cpp中在前面我们介绍了函数的重载,可以使一个函数名通过参数的不同进行调用,但是这个对于相似的函数还是有些不太方便的,所以今天我们来学习一个更加便利的工具------模板。

模板

模板包括函数模板以及类模板,下面给出模板的概念;C++ 模板是一种泛型编程工具,允许编写与数据类型无关的代码。通过模板,可以定义函数或类,使其支持多种数据类型,而无需为每种类型重复编写代码。

首先我们以一个例子进入主题


运行结果:

现在我们来分析一下这个代码,这个代码我们可以看到他是有一个template的关键词,他的意思是模板。函数模板的基础形式是这样的;

这两种形式都可以的,typename这种形式是更加贴切的,而class是比较简单的,这两种写法都是正确的。然后通过上面的代码我们看到我们只写了一个交换函数的模板,它可以对int类型以及double类型同时使用,在这里的传参编译器可以自己识别我们传参的类型,从而达到简化的效果。

在这里肯定会有朋友这样想,我们可不可以对一个只有一个模板参数的函数,传两个不同类型的参数呢?

我们可以看到这样是不行的,因为我们只定义了一个模板参数,如果需要传两个不同的类型,需要我们再定义一个模板参数,就像最开始给的那个代码,这种方式是比较好的,当然我们也可以这样:

给b进行隐式类型转换,也可以达到这样的操作。这个叫做推导实例化 ,意思是由编译器根据我们的传参,编译器自己识别类型。

下面这个的话是显示实例化,是我们自己给定的参数类型。

推导实例化与显示实例化的对比:

但是在特定的场景的时候必须哦使用显示实例化:

在这里的时候编译器无法自己推导出来返回的类型,所以这个时候就必须让我们自己指定返回的类型。

下面我们看一下这个代码:

我们可以看到当函数模板与函数同时存在的时候,编译器优先会调用定义的函数,其实这是一个很好理解的事情。当一顿自己喜欢吃的饭已经做好的时候,大部分人肯定不会在自己做饭了,编译器也是这样的。

讲完了函数模板,我们现在进入类模板。

这是一个简单的类模板,他的形式其实与函数模板没有什么太大的区别,只不过函数的模板,每个函数模板只对应一个函数 ,但是类的模板可以对应多个函数,切记类模板也是只能对应一个类。

函数在类模板内定义是这样的,但是如果函数的声明与定义分离的话是什么样子的呢?

我们看下面对代码:

我们可以看到函数的声明与定义分离之后,我们需要指明函数的模板是谁,所以我们需要在函数的前面再次定义类的模板,但是这个模板参数可以是T也可以不是T,因为这个T仅仅只是一个代称,但是不建议在外面定义的不同,因为这个很影响阅读效果。

今天的内容就分享到这里,感谢大家的观看。

相关推荐
老四啊laosi2 小时前
[C++进阶] 25. C++11新特性(一)
c++·c++11·右值
咸鱼翻身小阿橙2 小时前
QT-P3
开发语言·qt·计算机视觉
心易行者2 小时前
代码写好了,然后呢?——手把手教你把Python脚本变成能赚钱的Web应用
开发语言·前端·python
AKA__Zas2 小时前
初识 事务
java·开发语言·数据库·sql
今儿敲了吗2 小时前
常用UI组件
开发语言
零号全栈寒江独钓2 小时前
基于c/c++实现linux/windows跨平台ntp时间戳服务器
linux·c语言·c++·windows
笨鸟先飞的橘猫2 小时前
数据结构学习——跳表
数据结构·python·学习
高斯林.神犇2 小时前
六、java配置类改造ioc
java·开发语言
ulias2122 小时前
进程初识(1)
linux·运维·服务器·网络·c++