IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> ******C++之模板******(函数模板与类模板) -> 正文阅读

[C++知识库]******C++之模板******(函数模板与类模板)


在这里插入图片描述

前言:
在看本篇博客之前,我想先提出一个问题:以Add函数为例
在这里插入图片描述
但是看上述函数,我们能发现这个函数有什么不足?
很明显这个Add函数只能对整形数据进行处理,当我们想要对其他数据类型的数据进行处理的时候我们又有什么方法?
方法一:我们可以利用函数的重载对所有我们想要处理的数据类型进行重载
在这里插入图片描述
这是一个可行的方法,但是这个方法肉眼可见的麻烦,我们得把所有类型全部写一遍,那可真是把人写麻了!!
而且这个方法是能处理内置类型,如果用户自己创建了一个类型怎么办?
所以为了处理这种情况,C++的大佬为我们提供了简便方法

——————————————模板—————————————

举个简单的例子:钢铁厂有做狗饭盆的模具,小明委托钢铁厂给自己的狗旺财做个一饭盆,如果小明家没有钱,那他给钢铁厂提供不锈钢作为材料,那旺财只有一个不锈钢饭盆可以用;如果小明家是小康家庭,提供了铁,那么旺财就拥有一个铁饭碗;如果小明很爱旺财,给钢铁厂的是金子,那么旺财就是拥有金饭盆的勾勾了!!!

如果在C++中,也能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(生成具体类型的代码),我们能少掉多少头发啊!!!!!
幸运的是我们的前辈们在掉了不少头发之后为我们提供了模板

模板分为了两类:
在这里插入图片描述
我们将主要对这两种模板进行介绍。

1、函数模板

1.1什么是函数模板?

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

1.2函数模板格式

以Add函数为例:
在这里插入图片描述注:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

对比两个函数我们发现,在使用template关键字后我们在<>内写的代码可以理解为告诉编译器 “ T ” 是数据类型,那么在编译器对下面的模板函数进行编译时,会对T进行相对的替换。
在这里插入图片描述
///

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。
///

2.3模板调用原理

在函数运行之前,编译器需要先对代码进行编译,在编译阶段,对于模板有两种实例化方式:
在这里插入图片描述
①:如果是隐式实例化:让编译器根据实参推演模板参数的实际类型
编译器会对传递的实参的类型进行推演,然后确定模板参数列表中T的实际类型,确定出来后再根据确定的类型生成实际类型的代码。

例:Add(1,2) 左:int 右:int ---------->生成:int Add< int >

②:显示实例化:在函数名后的<>中指定模板参数的实际类型
如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。
例:Add< int >(1,2)

2.4模板函数的匹配原则

①: 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数

②:对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板

③: 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

2、类模板

在学习了函数模板之后,我们再进型类模板的学习就会简单很多。
举一个简单的例子:我们之前肯定都接触过数据结构的顺序表,我们先用普通的类实现一个顺序表。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在以前我们想要将顺序表类型更改我们需要使用typedef,方便我们随时对数据类型进行修改,但是这种方法也有隐患,现在我们学习了模板之后我们只需要在类前加上template< class T >并将类中Datatype修改为T即可。

2.1 类模板的实例化

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

      Vector类名,Vector< int >才是类型

      Vector< int > s1;

      Vector< double > s2;

总结

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:27:42  更:2021-07-11 16:29:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 19:59:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码