C++——函数模板和类模板

目录

        一、函数模板

        二、类模板


        一、函数模板

        当我们没有使用到模板的时候,我们如果要交换两个数据,那么我们就要根据交换的数据的类型,写出例如以下的函数:

void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}void Swap(double& a, double& b)
{double tmp = a;a = b;b = tmp;
}...

        虽然通过函数重载可以实现我们想要的功能,但是非常的麻烦。C++中添加了模板的使用,这就解决了这个问题。

        模板分为:函数模板类模板

        函数模板代表了一个函数家族,该函数模板与类型无关,在使用的时候才被编译器实例化,编译器会根据传入的实参类型,生成对应版本的函数

        函数模板的基本格式为:

template <typename T1,typename T2 ......>
返回值 函数名(参数列表)

        这里的typename还可以用class代替,效果是一样的。

template<class T>
void Swap(T& a, T& b)
{double tmp = a;a = b;b = tmp;
}int main()
{int x = 1, y = 2;double a = 1.1, b = 2.2;Swap(x, y);Swap(a, b);Swap(x, b);return 0;
}

        这里的三次调用Swap函数前两次都是正确的,第三次则是错误的,因为这里我们定义的模板里只有一种类型,而我们传入的实参有两种类型,编译器不能识别我们到底是要用哪种类型的函数。

template<class T>
T Add(const T& a,const T& b)
{return a + b;
}int main()
{int x = 1, y = 2;double a = 1.1, b = 2.2;Add(x, y);Add(a, b);Add(x,b);return 0;
}

        要解决这个问题的办法有两种,一是我们主动给对实参进行强制类型转化,但这个又会出现一个问题,类型转化后的结果是保存在一个临时变量中的,临时变量具有常性,我们形参的类型是T&,而实参是临时变量,被const修饰,所以传参的时候会发生权限的放大,还是会报错,我们要把形参也用const修饰上,才能保证形参和实参一致。

        第二种方法就是显示的实例化:在函数名后加上<>指定模板的参数类型。这样函数模板就可以支持自动的隐式类型转化了。

        同时非函数模板和函数模板可以同时存在,这个函数模板也可以实例化成这个非函数模板。当其他条件都相同时,在调用时会优先调用这个非函数模板,而不是通过函数模板去实例化。

        还有一种情况必须显示的实例化:形参中没有涉及模板类型的,比如:

template<class T>
T* func(int n)
{return new T[n];
}

        这种情况我们在使用这个函数的时候,模板类型和我们传入的参数无关,编译器没办法识别到我们想要实例化出什么类型,因此在调用这种函数模板时,必须显示的实例化。

        二、类模板

        类模板的用法和函数模版类似 ,但是有一点,类模板的声明和定义不建议分离到两个文件中,会出现链接错误

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

        当一个文件中的类模板的成员函数的声明的定义分离时,写法如下:

template<class T>
class Stack
{
public:Stack(int n = 4);
private:T* arr;int _size;int _capacity;
};//template只作用和他相连的一个类或者函数,在类外定义的时候要重新写一遍
//这里的变量名可以于类使用的变量名不同 因为它代表的仅是一种变量类型 没有实际意义
template<class T>
Stack<T>::Stack(int n)
{arr = new T[n];_size = 0;_capacity = n;
}

        类模板的实例化和函数模板的实例化不同,类模板在实例化时,需要在类模板的名字后面加上<>,然后把需要实例化的类型放在<>中,类模板的名字不是真的类,实例化的结果才是一个真正的类。

template<class T>
class Stack
{
public:Stack(int n = 4);
private:T* arr;int _size;int _capacity;
};template<class T>
Stack<T>::Stack(int n)
{arr = new T[n];_size = 0;_capacity = n;
}int main()
{//这里的Stack<int> Stack<double>才是类型//Stack只是类名Stack<int> st1;Stack<double> st2;
}

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

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

相关文章

HardeningMeter:一款针对二进制文件和系统安全强度的开源工具

关于HardeningMeter HardeningMeter是一款针对二进制文件和系统安全强度的开源工具&#xff0c;该工具基于纯Python开发&#xff0c;经过了开发人员的精心设计&#xff0c;可以帮助广大研究人员全面评估二进制文件和系统的安全强化程度。 功能特性 其强大的功能包括全面检查各…

appium2.0 执行脚本遇到的问题

遇到的问题&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的时候 地址默认加的 /wd/hub 在appium2.0上&#xff0c; 服务器默认路径是 / 如果要用/wd/hub 需要通过启动服务时设置基本路径 appium --base-path/wd/hub 这样就能正常执行了 方法二…

react基础样式控制

行内样式 <div style{{width:500px, height:300px,background:#ccc,margin:200px auto}}>文本</div> class类名 注意&#xff1a;在react中使用class类名必须使用className 在外部src下新建index.css文件写入你的样式 .fontcolor{color:red } 在用到的页面引入…

C#学习-刘铁猛

文章目录 1.委托委托的具体使用-魔板方法回调方法【好莱坞方法】&#xff1a;通过委托类型的参数&#xff0c;传入主调方法的被调用方法&#xff0c;主调方法可以根据自己的逻辑决定调用这个方法还是不调用这个方法。【演员只用接听电话&#xff0c;如果通过&#xff0c;导演会…

STM32使用Wifi连接阿里云

目录 1 实现功能 2 器件 3 AT指令 4 阿里云配置 4.1 打开阿里云 4.2 创建产品 4.3 添加设备 5 STM32配置 5.1 基础参数 5.2 功能定义 6 STM32代码 本文主要是记述一下&#xff0c;如何使用阿里云物联网平台&#xff0c;创建一个简单的远程控制小灯示例。 完整工程&a…

vue、js截取视频任意一帧图片

html有本地上传替换部分&#xff0c;可以不看 原理&#xff1a;通过video标签对视频进行加载&#xff0c;随后使用canvas对截取的视频帧生成需要的图片 <template> <el-row :gutter"18" class"preview-video"><h4>视频预览<span&…

【概率论三】参数估计:点估计(矩估计、极大似然法)、区间估计

文章目录 一. 点估计1. 矩估计法2. 极大似然法2.1. 似然函数2.2. 极大似然估计法 3. 评价估计量的标准3.1. 无偏性3.2. 有效性3.3. 一致性 二. 区间估计1. 区间估计的概念2. 正态总体参数的区间估计 参数估计讲什么 由样本来确定未知参数参数估计分为点估计与区间估计 一. 点估…

[iOS]浅析isa指针

[iOS]浅析isa指针 文章目录 [iOS]浅析isa指针isa指针isa的结构isa的初始化注意事项 上一篇留的悬念不止分类的实现 还有isa指针到底是什么 它是怎么工作的 class方法又是怎么运作的 class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags 这里面的class又是何方…

新华三H3CNE网络工程师认证—VLAN使用场景与原理

通过华三的技术原理与VLAN配置来学习&#xff0c;首先介绍VLAN&#xff0c;然后介绍VLAN的基本原理&#xff0c;最后介绍VLAN的基本配置。 一、传统以太网问题 在传统网络中&#xff0c;交换机的数量足够多就会出现问题&#xff0c;广播域变得很大&#xff0c;分割广播域需要…

R语言优雅的把数据基线表(表一)导出到word

基线表&#xff08;Baseline Table&#xff09;是医学研究中常用的一种数据表格&#xff0c;用于在研究开始时呈现参与者的初始特征和状态。这些特征通常包括人口统计学数据、健康状况和疾病史、临床指标、实验室检测、生活方式、社会经济等。 本人在既往文章《scitb包1.6版本发…

C++客户端Qt开发——QT初识

二、QT初识 1.helloworld示例 ①图形化的方式&#xff0c;在界面上创建出一个控件&#xff0c;显示helloworld 右侧通过树形结构&#xff0c;就会显示出当前界面上有哪些控件 此时.ui文件已发生变化 qmake就会在编译项目的时候&#xff0c;基于这个内容&#xff0c;生成一段C…

35.UART(通用异步收发传输器)-RS232(2)

&#xff08;1&#xff09;RS232接收模块visio框图&#xff1a; &#xff08;2&#xff09;接收模块Verilog代码编写: /* 常见波特率&#xff1a; 4800、9600、14400、115200 在系统时钟为50MHz时&#xff0c;对应计数为&#xff1a; (1/4800) * 10^9 /20 -1 10416 …

链接追踪系列-10.mall-swarm微服务运行并整合elk-上一篇的番外

因为上一篇没对微服务代码很详细地说明&#xff0c;所以在此借花献佛&#xff0c;使用开源的微服务代码去说明如何去做链路追踪。 项目是开源项目&#xff0c;fork到github以及gitee中&#xff0c;然后拉取到本地 后端代码&#xff1a; https://gitee.com/jelex/mall-swarm.gi…

微软研究人员为电子表格应用开发了专用人工智能LLM

微软的 Copilot 生成式人工智能助手现已成为该公司许多软件应用程序的一部分。其中包括 Excel 电子表格应用程序&#xff0c;用户可以在其中输入文本提示来帮助处理某些选项。微软的一组研究人员一直在研究一种新的人工智能大型语言模型&#xff0c;这种模型是专门为 Excel、Go…

BiLSTM 实现股票多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

算法题目整合

文章目录 121. 小红的区间翻转142. 两个字符串的最小 ASCII 删除总和143. 最长同值路径139.完美数140. 可爱串141. 好二叉树 121. 小红的区间翻转 小红拿到了两个长度为 n 的数组 a 和 b&#xff0c;她仅可以执行一次以下翻转操作&#xff1a;选择a数组中的一个区间[i, j]&…

SpringBoot集成MQTT实现交互服务通信

引言 本文是springboot集成mqtt的一个实战案例。 gitee代码库地址&#xff1a;源码地址 一、什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&…

教大模型学数学,总共分几步?

大模型那么聪明&#xff0c;为什么数学题总是做不对、做不会&#xff1f; 从答高考数学卷难及格到普通数字比大小出错&#xff0c;大模型总算让大家觉得并非“无所不能”。这一方面让普通人开心&#xff0c;毕竟讲到AI取代人类看起来为时尚早&#xff0c;而另一方面&#xff0…

Autosar RTE配置-Assembly和Delegation的使用-基于ETAS软件

文章目录 前言Assembly和Delegation的含义Delegation的使用Assembly的使用总结 前言 RTE中的Compostion内部的SWC之间的连接使用Assembly Connector进行连接。这样的连接一般都是一个SWC的Pport对应另一个SWC的Rport。而Autosar软件中往往不只一个Composition(一般可以以核的数…

Android Toast

Toast Toast是Android常用的简单控件&#xff0c;主要用来进行简短的信息提示&#xff0c;如图1所示。 图1 Toast效果图 Toast的基本用法很简单&#xff0c;不需要设置layout&#xff0c;只需要在程序中调用即可。Toast调用makeText()方法设置需要显示的界面、显示的内容、显…