【C++基础(十)】C++泛型编程--模板初阶

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C++从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习C++
  🔝🔝


在这里插入图片描述

模板

  • 1. 前言
  • 2. 函数模板
  • 3. 函数模板原理
  • 4. 函数模板实例化
  • 5. 函数模板参数的匹配规则
  • 6. 类模板
  • 7. 类模板的实例化
  • 8. 总结以及拓展

1. 前言

在学习数据结构时会遇见以下的情况
数据结构中存储的类型往往不能确定
所以在实现数据结构时往往是这样做的

typedef int DateType

在写代码时用DateType来表示类型
如果想存储浮点型只需将int改为float

但是这样写会遇见一个问题:
写好数据结构类后在创建对象时
此.cpp文件只能创建一种类型的对象
对象存储的全是int/char/double类型
不能同时创建存储int的和char的对象

Data d1;//存储的int类型
Date d2;//存储的char类型

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

本章重点:

本篇文章重点讲解函数模板
和类模板的使用以及特性


2. 函数模板

请看以下函数代码:

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}
void Swap(char& left, char& right)
{char temp = left;left = right;right = temp;
}

这样写非常的麻烦
使用模板可以使代码通用于不同类型:
swap函数模板:

template<typename T>
void Swap( T& left, T& right)
{T temp = left;left = right;right = temp;
}

写好上面的代码后,传int类型进去
T就会被实例化为int,以此类推

template和typename是规定
好了必须这样写,T是自己取的名字
其中,typename可以用class替换
并且一次性可以定义多个类型:

template<class T1,typename T2,class T3>

3. 函数模板原理

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

在这里插入图片描述

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

可以用下面这张图来理解:

在这里插入图片描述


4. 函数模板实例化

  1. 隐式实例化

让编译器根据实参推演模板参数实际类型

template<class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a1 = 10, a2 = 20;double d1 = 10.0, d2 = 20.0;Add(a1, a2);Add(d1, d2);}

第一次调用的T被推演为int类型
第二粗调用的T被推演为double

不能这样写代码:

Add(a1, d1);

系统根据a1推演出T是int类型
但是d1是double类型不能用int
类型的参数啦接受,所以会报错


  1. 显示实例化

在函数名后的<>中指定模板参数的类型

int main(void)
{int a = 10;double b = 20.0;// 显式实例化Add<int>(a, b);return 0;
}

如果类型不匹配
编译器会尝试进行隐式类型转换
若无法转换成功编译器将会报错


5. 函数模板参数的匹配规则

模板函数和普通函数可以同时存在:

// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}

在调用函数时若参数和非模板函数匹配
那么编译器会优先调用非模板函数
若非模板函数不匹配或模板函数更匹配
那么编译器会优先调用模板函数

Add(10,20)//调用非模板
Add(11.1,6.3);//调用模板

6. 类模板

类模板的应用非常广泛
像开头提到的数据结构问题

类模板的定义格式:

template<class T1, class T2, ..., class Tn>
class example
{// 类内成员定义
};

和函数模板类似,类模板也可以同时
定义多个模板参数

写一个简易的顺序表:

template<class T>
class Vector
{ 
public :Vector(size_t capacity = 10): _Data(new T[capacity]), _size(0), _capacity(capacity){}T& operator[](size_t pos){assert(pos < _size);return _Data[pos];}private:T* _Data;size_t _size;size_t _capacity;
};

所有实际类型需要出现的地方用T代替


7. 类模板的实例化

和函数模板不同,类模板没有隐式推演
用户必须显示实例化

Vector<int> v1;

注意:
Vector是类名
Vector< int >才是类型

当在类中声明一个函数
但是想在类外定义时
若函数的参数或内部使用的类型
和模板有关系,那么必须这样写:

template<class T>
class Vector
{ 
public ://类中声明函数void push_back(T x);
private:T* _Data;size_t _size;size_t _capacity;
};

类外定义:

template<class T>
void Vector<T>::push_back(T x)
{_Date[_size] = x;_size++;
}

注:必须要再加上类模板template
并且要指定类域


8. 总结以及拓展

泛型编程是C++的一大利器
它极大的减少了代码的复杂程度
并且增加了代码的可读性

C++基础部分的内容已经全部结束
下一阶段进入C++中阶:STL的使用

在这里插入图片描述

拓展:

泛型编程拓展阅读


🔎 下期预告:STL库的介绍以及使用 🔍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1381410.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

PETool free分享

百度盘下载pe解析工具、PETool.1.0.0.5.exe&#xff08;免费&#xff09; 链接: https://pan.baidu.com/s/1A44RaB3GotWfmWmQCv3qqw 提取码: 33fh MD5: 5691CCA8BD8C5BDEE5F839098CE82A2A SHA1: 1DAD3D205405EB8E99BD39DAE891463C15F995CD 下载后请校验文件防篡改。 文件安全性…

CPABE

属性加密的基础是秘密共享。 什么是秘密共享&#xff1f; 秘密共享指的是dealer有一个秘密&#xff0c;他想要在w个人中分享这个秘密&#xff0c;但是他希望任何单个人都无法计算出&#xff08;获得&#xff09;这个秘密&#xff0c;也就是说他想任意t个人在一起才能够把这个…

Peers

Peers 区块链网络主要由一组peers节点组成。 peers是网络的基本要素&#xff0c;因为他们主持分类账和智能合约。 回想一下&#xff0c;分类账不可变地记录智能合约产生的所有交易。 智能合约和分类帐分别用于封装网络中的共享进程和共享信息。 peers的这些方面使他们成为理解H…

Protobuf-importimport public

【转载】https://www.cnblogs.com/letsgollc/p/7423248.html 场景&#xff1a;假如有文件hundredbulls.proto&#xff0c;需要导入另一个文件common.proto&#xff0c;两者在同一个目录中. 导入方式 在hundredbulls.proto文件的开头&#xff0c;使用关键字import导入另一个文件…

pump-probe技术简介

pump-probe技术简介 pump-probe定义介绍应用 pump-probe定义介绍 泵浦-探测&#xff08;pump-probe&#xff09;是一种利用短激光脉冲测量超快现象的技术。**当泵浦光照射在样品上时&#xff0c;可以激发出各种各样的物理现象&#xff0c;例如电子激发。随后&#xff0c;经过一…

记录更换若依框架的用户和部门两种表的过程

背景&#xff1a; 公司使用若依框架快速构建项目&#xff0c;客户那边原有的数据要同步过来&#xff0c;且要求字段与原先的字段一致&#xff0c;可以让数据丝滑无畅导入。用户表和部门表是基础在代码出现的地方比较多&#xff0c;该如何考虑去过度去更换&#xff09; 如何快速…

【单片机/嵌入式】最完整学习路线

一.什么是单片机&#xff1f;什么是嵌入式&#xff1f;它们之间的区别与联系。 关于这个问题我在网上寻找到了相关文章解释得很详细&#xff0c;不了解的同学可以参考一下这篇文章&#xff1a;到底什么是嵌入式&#xff1f;什么是单片机&#xff1f; - 知乎 二.学习路线 一个人…

大学学习历程简单总结

一、主要学习经历&#xff1a; 2017年9月进入大学&#xff1a; 最开始自己对大学的认识是一种特别仰慕的感觉&#xff0c;并且当时自己认为在大学里面是做各种各样的研究和学习的&#xff0c;并且认为只有对科研特别喜欢而且拥有天赋的大学生才能去升学为研究生&#xff1b; 进…

“机器学习”名字的由来

阿瑟萨缪尔(Arthur Samuel, 1901-1990) 阿瑟萨缪尔是人工智能研究的先驱。 从1949年到1960年代后期&#xff0c;他在让计算机从经验中学习方面做了最出色的工作&#xff0c;而他的研究工具是跳棋游戏。&#xff08;玩游戏的程序通常在人工智能研究中扮演果蝇在遗传学中所扮演的…

【Unity每日一记】让一个物体按余弦曲线移动—(三角函数的简单运用)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

Bootstrap 样式之 文本颜色

Bootstrap 自定义的文本颜色 源码查看&#xff08;测试版本3.x&#xff09; ------------------------------------------------------------ 先来看看bootstrap自定义的文本颜色是什么样的&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh-C…

A. Red Versus Blue

https://codeforces.com/contest/1659/problem/A input 3 7 4 3 6 5 1 19 13 6output RBRBRBR RRRBRR RRBRRBRRBRRBRRBRRBRinput 6 3 2 1 10 6 4 11 6 5 10 9 1 10 8 2 11 9 2output RBR RRBRBRBRBR RBRBRBRBRBR RRRRRBRRRR RRRBRRRBRR RRRBRRRBRRR题意 T组询问&#xff…

new、new[]和new()

文章目录 new是怎么调用的&#xff1f;那么delete呢&#xff1f;new[]和delete[]为什么要成对使用&#xff1f;注意到了operator new和operator delete~new()怎么用&#xff1f;delete()有点复杂 new是怎么调用的&#xff1f; 这里是一条new的使用语句&#xff1a; A *pc ne…

Bootstrap颜色对应对照表

Bootstrap自带颜色&#xff1a;class "bg-xxx" bg-red红色bg-yellow黄色bg-aqua湖绿色bg-blue蓝色bg-light-blue浅蓝色bg-green绿色bg-navy藏青色bg-teal青色bg-olive橄榄色bg-lime荧光绿 bg-orange橙色bg-fuchsia紫红色bg-purple紫色bg-maroon红褐色bg-black黑色b…

BLE蓝牙

简介 重点了解GAP、ATT、Link Layer&#xff0c;其它有个简单认识即可 1. 什么是蓝牙主从关系&#xff1f; BLE蓝牙的角色有以下几种&#xff1a;广播者&#xff08;duAdvertise&#xff09;、扫描者&#xff08;Scanner&#xff09;、从设备zhi&#xff08;daoSlave&#x…

Bootstrap 样式之 元素背景颜色

在Bootstrap中既有文本颜色的样式也有元素背景颜色的样式&#xff0c; 我们先来看看元素背景的颜色有哪几种&#xff1f; 一共五种背景色&#xff1a;分别是 bg-primary bg-success bg-info bg-warning bg-danger 代码&#xff1a; <!DOCTYPE html> <…

HTB-Nibbles

HTB-Nibbles 信息收集开机 信息收集 nmap ssh 22http 80 gobuster和dirbuster 看看源码 一眼看到admin.php nmap sshhttp 看网页源码 nibbleblog gobuster和dirbuster admin.php一堆文件 开机 边查找文件边尝试了几个登陆密码&#xff0c;但是这几个密码都失败了。…

Bootstrap 颜色

一、Bootstrap 颜色 1.1 基本颜色 Bootstrap4 提供了一些有代表意义的颜色类&#xff1a;.text-muted, .text-primary, .text-success, .text-info, .text-warning, .text-danger, .text-secondary, .text-white, .text-dark and .text-light: <div class"container&q…

NewBlueFX TotalFX7 v6.0.200108 (x64) for AE/Premiere WIN版本

用于Adobe AfterFX和Premiere Pro WIN的NewBlueFX TotalFX7 v6.0.200108&#xff08;x64&#xff09; TotalFX具有177种效果的1,500多个预设。这是我们最全面的字幕工具&#xff0c;过渡&#xff0c;过滤器和视频编辑插件套件。获取所有NewBlue视频效果集合的功能齐全的Ultima…

BNext

又搬来了大神器啊 来自德国HassoPlattner计算机系统工程研究院的NianhuiGuo和HaojinYang等研究者提出了BNext模型&#xff0c;成为第一个在ImageNet数据集上top1分类准确率突破80%的BNN。 两年前&#xff0c;依靠早期 BNN 工作 XNOR-Net 起家的 XNOR.AI 被苹果公司收购&#…