深入学习cpp初阶模板

深入学习cpp初阶模板

前言:

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

正文:

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

模板

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

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


运行结果:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我们看下面对代码:

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

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

相关推荐
weixin_3077791334 分钟前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天4 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel4 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
海绵宝宝转agent4 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
每天都要写算法(努力版)4 小时前
【行业前沿报告】DAgger:让智能体在自己走到的状态上学习
人工智能·学习·机器学习
Wang's Blog5 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071575 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
hetao17338376 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
\光辉岁月/6 小时前
5.java-数组
java·开发语言
Java后端的Ai之路6 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数