模板初阶的学习

目录:
一:泛型模板
二:函数模板
三:类模板

1:泛型模板

  泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
以交换函数为列进行讲解:

void Swap(int& left, double & right)
{int temp = left;left = right;right = temp;
}
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;
}

我们发现这样的代码复用率不高,基本就是相同的代码(当然除类型不同),那有没有什么办法可以实现一个模具,让编译器自动根据参数类型进行指定函数的调用

2:函数模板
2.1 函数模板实例化

底层原理:编译器会根据当前调用函数实参的类型自动推到形参的类型(也就是说,使用模板 函数会自动生成对应类型的函数,即函数的实列化

 

 

当前这样写是不能编译过去的:在模板中,编译器不会自动进行类型的转换:实参a1对应double 类型,此时就会把 T自动视为double 类型,实参 a对应int 类型,此时编译器就发生了歧义,T到底是int 还是 double  类型

2.2实例化类型的转换

隐式实例化(强转)

显示实例化:在函数名后面 & 实参前面加上一个对应模板参数

 

2.3模板参数的匹配原则

思考以下问题:当调用Add(a,(int)a1)的时候编译器到底调用模板函数还是调用int Add(int&x,int &y)这个函数???

当我们调试的时候发现是调用模板函数,其实底层是调用现成的 int Add(int&x,int &y)这个函数,因为调用模板函数的最终目的还是生成对应的int Add(int&x,int &y)这个函数,现在有现成的函数,那编译器为什么要费这个劲呢

总结:

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

3:类模板

类模板的形式:

template < class T1 , class T2 , ..., class Tn  >
class 类模板名
{
    // 类内成员定义
};
template<class T>//模板参数列表
class Vector
{
public:Vector(size_t capacity = 10)   //构造函数: _pData(new T[capacity]), _size(0), _capacity(capacity){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();void PushBack(const T& data);//进栈void PopBack();//出栈// ...size_t Size() { return _size; }T& operator[](size_t pos){assert(pos < _size);return _pData[pos];}private:T* _pData;size_t _size;size_t _capacity;
};
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
//注意:一般不建议把类模板的定义和生命分开(出现连接错误)
template <class T>
Vector<T>::~Vector()
{if (_pData)delete[] _pData;_size = _capacity = 0;
}
3.1类模板的实例化
类模板实例化与函数模板实例化不同, 类模板实例化需要在类模板名字后跟 <> ,然后将实例化的类型放在 <> 中即可,类模板名字不是真正的类,而 实例化的结果才是真正的类
​​​​​​​

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博客系统项目测试(selenium+Junit5)

在做完博客系统项目之后&#xff0c;需要对项目的功能、接口进行测试&#xff0c;利用测试的工具&#xff1a;selenium以及Java的单元测试工具Junit进行测试&#xff0c;下面式测试的思维导图&#xff0c;列出该项目需要测试的所有测试用例&#xff1a; 测试结果&#xff08;全…

SQL执行流程图文分析:从连接到执行的全貌

SQL执行总流程 下面就是 MySQL 执行一条 SQL 查询语句的流程&#xff0c;也从图中可以看到 MySQL 内部架构里的各个功能模块。 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层&#xff0c; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在…

智能零售:引领购物新时代

智能零售通过整合人工智能、物联网、大数据和机器学习等技术&#xff0c;正在彻底改变传统的购物模式&#xff0c;为消费者和零售商提供前所未有的效率和个性化体验。 智能零售利用消费者数据分析来提供个性化的购物推荐。无论是在线平台或是实体店内&#xff0c;智能系统都能…

【JS】获取接口返回 EventStream 结构的数据(即接收读取 stream 流)

文章目录 EventStream 是一种服务器推送的数据格式&#xff0c;可以用于实时数据传输。 接口返回的示例图 获取示例&#xff1a; // 这里的 url 为虚拟的&#xff0c;仅供演示用 fetch(https://test.cn.com/api/agent/2, {method: POST,headers: {Content-Type: applicatio…

隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践

隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践 文章目录 隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践1.业务背景&#xff1a;安全核对产生的土壤1.1相关政策出台1.2 数据差异的来源 2.产品方案&#xff1a;从试点到规模化的路3.技术共建&#xf…

12V转5V3A降压恒压WT6019

12V转5V3A降压恒压WT6019 WT6019同步降压电源管理芯片。这个小宝贝啊&#xff0c;不管你怎么折腾它&#xff0c;电流都能稳稳地输出3A&#xff0c;而且效率高得吓人&#xff0c;达到92%呢&#xff01; 说到它的工作原理&#xff0c;WT6019用的是电流模式控制&#xff0c;这意…

[BT]BUUCTF刷题第15天(4.11)

第15天&#xff08;共3题&#xff09; Web [WUSTCTF2020]朴实无华 打开网站没有发现可用信息&#xff0c;根据其他人题解了解到网站标题带有bot字样&#xff0c;因此尝试查看robots.txt文件 发现新的文件 User-agent: * Disallow: /fAke_f1agggg.php访问发现并无flag 但此…

桥接模式:解耦抽象与实现的设计艺术

在软件设计中&#xff0c;桥接模式是一种结构型设计模式&#xff0c;旨在将抽象部分与其实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过提供更加灵活的代码结构帮助软件开发人员处理不断变化的需求&#xff0c;特别是在涉及多平台应用开发时。本文将详细介绍桥接…

Rocky(Centos)数据库等高并发或高io应用linux系统调优,及硬件问题排查(含网络、磁盘、系统监控)

一、系统参数优化 默认的最大打开文件数是1024.不满足生产环境的要求。按照如下配置&#xff1a; 1、修改 systemctl管理的 servie 资源限制 编辑/etc/systemd/system.conf # 全局的打开文件数 DefaultLimitNOFILE2097152 # 全局打开进程数 DefaultLimitNPROC655352、调整系…

【C++类和对象】上篇

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

Git 解决分支冲突

一、前言 一直习惯于 add commit push 的三步走&#xff0c;偶然间看到了一个评论说在 push 之前还有一个 pull&#xff0c;小小的疑问就埋在了我的心里。于是我就先了解了 pull 的工作原理&#xff0c;就是先拉取代码&#xff08;fetch&#xff09;再合并分支&#xff08;mer…

rabbitmq安装rabbitmq-delayed-message-exchange插件

下载地址&#xff1a;Community Plugins | RabbitMQ 上传到rabbitmq安装目录的/plugins目录下 我的是/usr/lcoal/rabbitmq/plugins/ 直接安装 [rootk8s-node1 rabbitmq]# rabbitmq-plugins enable rabbitmq_delayed_message_exchange [rootk8s-node1 rabbitmq]# rabbitmq-pl…