C++ 泛型编程,函数模版和类模版

1.泛型编程

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

就比如说活字印刷术,就是提供一个模具,然后根据模具来印刷出不同的字。

泛型编程跟着类似,提供一个模版,根据这个模版由编译器自动生成不同的函数或者类

2.函数模版

2.1为什么要有函数模版

在c语言中,我们想交换两个整数、交换两个浮点数、交换自定义类型类型,我们必须自己手动写n个函数!!!并且每个函数的函数名都不一样!!!

void SwapInt(int& a,int& b)
{int c = a;a = b;b = c;
}
void SwapDouble(double& a, double& b)
{double c = a;a = b;b = c;
}int main()
{int a1 = 1, b1 = 2;SwapInt(a1, b1);cout << a1 << " " << b1 << endl;double a2 = 1.1, b2 = 2.2;SwapDouble(a2, b2);cout << a2 << " " << b2 << endl;return 0;
}

有没有一种方法能使我们不用再写很多个函数,只用写一个函数(模版),就能完成各个类型的交换呢?这时候函数模版就登场了

2.2怎么使用函数模版

模版格式:

template<class T1,class T2,class T3...>

返回值 函数名(函数参数){  函数体  }

template<class T>
void Swap(T &a ,T &b)
{T c = a;a = b;b = c;
}
int main()
{int a1 = 1, b1 = 2;Swap(a1, b1);cout << a1 << " " << b1 << endl;double a2 = 1.1, b2 = 2.2;Swap(a2, b2);cout << a2 << " " << b2 << endl;return 0;
}

2.3函数模版的实例化

这里我们提供的swap是仅仅只是一个函数模版而已,并不是真正的函数,用不同类型的参数使用函数模板时需要由编译器自动生成一个相应的函数,这就叫做函数模版的实例化!!!

模版的实例化分为显示实例化隐式实例化

2.3.1隐式实例化

由编译器识别实参类型,推导出模版参数的类型

template<class T>
void Swap(T &a ,T &b)
{T c = a;a = b;b = c;
}
int main()
{int a1 = 1, b1 = 2;Swap(a1, b1);double a2 = 1.1, b2 = 2.2;Swap(a2, b2);return 0;
}

由传进来的参数推导出T的类型,这种就叫做隐式实例化

2.3.2显示实例化

在函数名后的<>中指定所传的具体类型

template<class T>
void Swap(T &a ,T &b)
{T c = a;a = b;b = c;
}
int main()
{int a1 = 1, b1 = 2;Swap<int>(a1, b1);double a2 = 1.1, b2 = 2.2;Swap<double>(a2, b2);return 0;
}

3.类模版

3.1为什么需要有类模版

当我们需要两个栈,一个栈存int类型,一个存double类型时,我们又只能自己写两个不同的类,这两个类 类名不同,但是类中除了类型,其他的都是一样的!!!

class StackInt
{
public:StackInt(int capacity = 4){_a = new int[capacity];_top = 0;_capacity = capacity;}~StackInt(){delete[] _a;_a = nullptr;_top = _capacity = 0;}
private:int* _a;int _top;int _capacity;
};
class StackDouble
{
public:StackDouble(int capacity = 4){_a = new double[capacity];_top = 0;_capacity = capacity;}~StackDouble(){delete[] _a;_a = nullptr;_top = _capacity = 0;}
private:double* _a;int _top;int _capacity;
};int main()
{StackInt st1;StackDouble st2;return 0;
}

这时候就需要用到我们的类模版来解决这个问题了.

3.2怎么使用类模版

模版格式:

template<class T1,class T2,class T3...>

class 类名 {  成员函数和成员变量  };

template<class T>
class Stack
{
public:Stack(int capacity = 4){_a = new T[capacity];_top = 0;_capacity = capacity;}~Stack(){delete[] _a;_a = nullptr;_top = _capacity = 0;}
private:T* _a;int _top;int _capacity;
};int main()
{Stack<int> st1;Stack<double> st2;return 0;
}

3.3类模版的实例化

类模版的实例化和函数模版的实例化不同,类模版的实例化是在类名后加<>,在<>中加上实例化的类型, 类模板名字不是真正的类,而实例化的结果才是真正的类

Stack是类名

Stack<int>是类型

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

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

相关文章

微服务--05--配置管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 配置管理这些问题都可以通过统一的配置管理器服务解决。而Nacos不仅仅具备注册中心功能&#xff0c;也具备配置管理的功能&#xff1a; 1.配置共享1.1.添加共享配置…

【Spark基础】-- RDD 转 Dataframe 的三种方式

一、环境说明 Oracle JDK 11Scala 2.12.17Apache Spark 3.1.1Apache Hadoop 3.1.0 二、RDD 转 Dataframe 的方法 1、通过 StructType 创建 Dataframe(强烈推荐使用这种方法) /*** 方法一:通过 StructType 创建 Dataframe* @param spark SparkSession* @param rdd 输入* @…

【封装UI组件库系列】封装Button图标组件

封装UI组件库系列第四篇封装Button按钮组件 &#x1f31f;前言 &#x1f31f;封装Button组件 1.分析封装组件所需支持的属性与事件 支持的属性&#xff1a; 支持的事件&#xff1a; 2.创建Button组件 &#x1f31f;封装功能属性 type主题颜色 plain是否朴素 loading等…

方舟笔记:方舟开发框架概述

方舟笔记 方舟开发框架概述 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134677116 今年&#xff08;…

API接口测试工具的主要作用及选择指南

API接口测试是现代软件开发中至关重要的一环。为了确保不同组件之间的无缝集成和功能正常运作&#xff0c;API接口测试工具应运而生。本文将介绍API接口测试工具的主要作用&#xff0c;以及在选择适合项目的工具时需要考虑的因素。 1、功能测试&#xff1a;API接口测试工具的首…

Linux内存回收:LRU算法

linux操作系统再内存不足时会使用Swap机制&#xff0c;将一些不经常使用的匿名内存页放到磁盘当中&#xff0c;等下次需要时再读取到内存当中&#xff0c;而这个LRU算法就是用来选择把哪些不常使用的匿名内存页放到磁盘当中的。 LRU&#xff08;Least Recently Used&#xff09…

【面经八股】搜广推方向:面试记录(四)

【面经&八股】搜广推方向:面试记录(四) 文章目录 【面经&八股】搜广推方向:面试记录(四)1. 自我介绍2. 项目问答3. 八股4. 编程题4.1 大数加法4.2 平面最近点对问题求解5. 反问环节1. 自我介绍 。。。。。。 2. 项目问答 问的有点细。。。。。。 3. 八股 1)…

使用 eyed3 从 mp3 文件名获取歌曲名设置 ID3 属性

需求 近期有朋友拜托弄一批 mp3 放 U 盘里面以便开车的时候听&#xff0c;于是下载了一批歌曲&#xff0c;都整理成 歌曲名-歌唱者.mp3 这样的文件名。可是有些播放器会优先使用 ID3&#xff08;即 mp3 文件的一个自带的信息段。顺便吐槽一下&#xff0c;官方网站 https://id3…

android交叉编译pidstat iostat mpstat

android交叉编译pidstat iostat mpstat 文章目录 android交叉编译pidstat iostat mpstat编译环境编译工具下载 编译过程编译环境系统环境NDK版本的选择 源码下载只编译简单的pidstat mpstat iostat编译编译脚本问题 使用技术支持 编译环境 编译工具下载 参考这个&#xff1a;…

python避坑指南(更新中)

os.path.join 避免连续的/&#xff0c;看示例即清楚&#xff0c;最好的避免方法是字符串首末都不要加’/&#xff1a; join用法 用join前面的符号将参数数组里面的字符串连接起来&#xff0c;注意join只有一个参数

tlais智能学习辅助系统-修改部门功能实现

学习黑马程序员的JavaWeb课程&#xff0c;自己写的部门信息修改部分程序 控制层&#xff1a; //DeptController.java /** * 根据ID查询部门信息 * param id * return */ GetMapping("/{id}") public Result select(PathVariable Integer id){log.info("查询id…

电子学会C/C++编程等级考试2021年03月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:石头剪刀布 石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。 一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头…

整数的补码转换(以[+, -]7为例)

要找到 -7 的二进制补码&#xff0c;我们可以按照以下步骤进行&#xff1a; 写出正数的二进制表示: 首先&#xff0c;写出 7 的二进制表示。假设我们在一个 8 位的系统中工作&#xff08;使用 8 位二进制数&#xff09;&#xff0c;那么 7 的二进制表示是 0000 0111。 取反&am…

Linux shell编程学习笔记31:alias 和 unalias 操作 命令别名

目录 0 前言1 定义别名2 查看别名 2.1 查看所有别名2.2 查看某个别名 2.2.1 alias 别名2.2.2 alias | grep 别名字符串2.2.3 使用 CtrlAltE 组合键3 unalias&#xff1a;删除别名4 如何执行命令本身而非别名 4.1 方法1&#xff1a;使用 CtrlAltE 组合键 && unalias4…

电动汽车的400V和800V充电技术

文章目录 400V充电和800V充电对比电动汽车400V充电和800V充电速度对比电动汽车400V充电技术电动汽车400V充电系统电动汽车800V充电系统电动汽车800V充电技术 400V充电和800V充电对比 400V充电和800V充电是指电动汽车充电系统的不同电压等级。这两种充电方式的主要区别在于充电…

使用 sync.Cond 来协调并发 goroutine 的访问共享资源

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 使用 sync.Cond 解决并发访问共享资源问题 在并发编程中&#xff0c;当多个 goroutine 需要访问共享资源时&#xff0c;我们需要…

Redis 主库挂了,如何不间断服务?

目录 1、哨兵机制的基本流程 2、主观下线和客观下线 3、如何选定新的主库&#xff1f; 总结 // 你只管前行&#xff0c;剩下的交给时间 在 reids 主从库集群模式下&#xff0c;如果从库发生故障了&#xff0c;客户端可以继续向主库或其他从库发送请求&#xff0c;进行相关的…

前端入门(三)Vue组件化编程、脚手架、插槽插件、存储、vuex、组件事件、动画、代理

文章目录 Vue 组件化编程 - .vue文件非单文件组件组件的注意点组件嵌套Vue实例对象和VueComponent实例对象Js对象原型与原型链Vue与VueComponent的重要内置关系 应用单文件组件构建 Vue脚手架 - vue.cli项目文件结构组件相关高级属性引用名 - ref数据接入 - props混入 - mixin …

java基础-IO

1、基础概念 1.1、文件(File) 文件的读写可以说是开发中必不可少的部分&#xff0c;因为系统会存在大量处理设备上的数据&#xff0c;这里的设备指硬盘&#xff0c;内存&#xff0c;键盘录入&#xff0c;网络传输等。当然这里需要考虑的问题不仅仅是实现&#xff0c;还包括同步…

Linux系统编程 day06 进程间通信

进程间通信 1. 进程间通信的概念2. 匿名管道pipe3. 命名管道FIFO4. 内存映射区 1. 进程间通信的概念 在Linux的环境下&#xff0c;进程地址空间是相互独立的&#xff0c;每个进程有着各自不同的用户地址空间。一个进程不能访问另一个进程中的内容&#xff0c;要进行数据交换必…