当前位置: 首页 > news >正文

C++学习笔记九--模版

目录

前言

1.函数模版

1.函数模版的概念和定义

2.函数模版的实例化

2.类模版

1.类模版的概念和定义

2.类模版的实例化

3.示例代码


前言

        这篇文章介绍下C++中的模版,包括函数模版和类模版

1.函数模版

        在编程的过程中,编写函数都会考虑将其写成模版函数,编写类的时候都会考虑将其写成类模版,从而减少不必要的重复。

1.函数模版的概念和定义

        函数模版是一些列相关函数的模型或者样板,这些函数的源代码形式相同,只是所针对的数据类型不同。

        函数模版的声明格式如下:

template<模版形参表声明><函数声明>

        其中模版形参可以是以下几种形式:

1.typename<参数名>

2.class <参数名>

3.<类型修饰><函数名>

        在上面的三种形式中,前两种是等价的。也就是说在声明函数模的时候,关键字typename和class功能一致。使用typename或class声明的参数称为虚拟类型参数;使用类型修饰声明的参数称为常规参数,在形式上与普通的函数参数声明相同。格式中的<函数声明>与一般函数声明类似,只是某些类型修饰符被虚拟类型参数所替代。

        例如我们定义个add函数模版,代码如下:

template <class T>
T add(T a, T b) {return  a + b;
}

         也可以使用typaneme声明函数模版:

template <typename T>
T add(T a, T b) {return  a + b;
}

        在上面的函数模版声明的定义中,T是一个虚拟类型参数,它既可以做函数的返回值类型,又可以做函数的形参的类型,还可以做函数体内变量的类型。类的成员函数也可以声明为函数模版。

2.函数模版的实例化

        模版函数值得是函数模版中声明的函数。

        定义好函数模版之后,编译系统将依据每一次对模版函数调用时所使用的数据类型生成适当的调用代码,并生成相应的函数版本。编译系统生成函数模版的某个具体版本的过程称为函数模版的实例化,每一个实例就是一个函数的定义。在实例化的过程中,用实参的实际类型代替虚拟类型。

        上述的add函数实例化的代码如下:

#include <iostream>
using namespace std;template <typename T>
T add(T a, T b) {return  a + b;
}int main(int argc, const char * argv[]) {int a = 1,b = 2;int c = add<int>(a,b);cout<<"整型add函数调用:"<<a<<"\t+\t"<<b<<"\t=\t"<<c<<endl;float a1 = 1.1,b1 = 2.1;float c1 = add<float>(a1,b1);cout<<"float类型调用add函数:"<<a1<<"\t+\t"<<b1<<"\t=\t"<<c1<<endl;double a3 = 1.22,b3 = 2.222;double c3 = add<double>(a3,b3);cout<<"double类型调用add函数:"<<a3<<"\t+\t"<<b3<<"\t=\t"<<c3<<endl;return 0;
}

2.类模版

1.类模版的概念和定义

        类模版指的是一系列相关类的模版或者样板,这些类的成员组成相同,成员函数的源代码形式相同,所不同的只是针对的类型。

        类模版声明的格式如下:

template<模版形参声明><类声明>

2.类模版的实例化

        类模版的实例化格式如下

类名 <模版实参表><对象名>

或者

  类名 <模版实参表><对象名>(构造函数实参表)

        下面的例子中展示了类模版的用法。

#include <iostream>
using namespace std;template <class T>
class Operates {T a;
public:Operates(){}Operates(T a){this->a = a;}void display(){cout<<"a="<<a<<endl;}T add(T b){this->a += b;display();return this->a;}T sub(T b){this->a -= b;display();return this->a;}T mult(T b){this->a *= b;display();return this->a;}T div(T b){this->a /= b;display();return this->a;}
};int main(int argc, const char * argv[]) {Operates<int> a(10);int b(10);a.add(b);a.sub(b);a.mult(b);a.div(b);return 0;
}

3.示例代码

1.用函数模版实现3个数值按照从最小值到最大值排序的程序

#include <iostream>
using namespace std;// 模板函数,用于交换两个值
template<typename T>
void mySwap(T& a, T& b) {T temp = a;a = b;b = temp;
}// 模板函数,用于对三个数值进行排序
template<typename T>
void sortThreeValues(T& a, T& b, T& c) {if (a > b) {mySwap(a, b);}if (b > c) {mySwap(b, c);}if (a > b) {mySwap(a, b);}
}int main(int argc, const char * argv[]) {int x = 1,y = 3,z = 2;//调用函数排序sortThreeValues(x, y, z);cout<<"排序之后的数据:\t"<<x<<"\t"<<y<<"\t"<<z<<endl;return 0;
}

2.利用函数模版设计一个求数组元素中和的函数,并检验

#include <iostream>
using namespace std;// 模板函数,用于交换两个值
template<typename T>
void mySwap(T& a, T& b) {T temp = a;a = b;b = temp;
}// 模板函数,用于对三个数值进行排序
template<typename T>
void sortThreeValues(T& a, T& b, T& c) {if (a > b) {mySwap(a, b);}if (b > c) {mySwap(b, c);}if (a > b) {mySwap(a, b);}
}template <typename T,size_t N>
T sumArray(const T (&arr)[N]) {T sum = 0;for (size_t i = 0; i< N ; i++) {sum += arr[i];}return sum;
}int main(int argc, const char * argv[]) {// 定义一个整型数组int intArray[] = {1, 2, 3, 4, 5};// 计算整型数组的和int intSum = sumArray(intArray);cout << "Sum of integers: " << intSum << endl;// 定义一个双精度浮点型数组double doubleArray[] = {1.1, 2.2, 3.3, 4.4, 5.5};// 计算双精度浮点型数组的和double doubleSum = sumArray(doubleArray);cout << "Sum of doubles: " << doubleSum << endl;return 0;
}

3.重载上题中的函数模版,使其能够进行两个数组的求和

#include <iostream>
using namespace std;// 函数模板,用于计算数组元素的和
template<typename T, size_t N>
T sumArray(const T (&arr)[N]) {T sum = 0;for (size_t i = 0; i < N; ++i) {sum += arr[i];}return sum;
}// 重载函数模板,用于计算两个数组对应元素的和
template<typename T, size_t N>
T sumArray(const T (&arr1)[N], const T (&arr2)[N]) {T sum = 0;for (size_t i = 0; i < N; ++i) {sum += arr1[i] + arr2[i];}return sum;
}int main(int argc, const char * argv[]) {// 定义两个整型数组int intArray1[] = {1, 2, 3, 4, 5};int intArray2[] = {6, 7, 8, 9, 10};// 计算两个整型数组的和int intSum = sumArray(intArray1, intArray2);cout << "Sum of integers: " << intSum << endl;// 定义两个双精度浮点型数组double doubleArray1[] = {1.1, 2.2, 3.3, 4.4, 5.5};double doubleArray2[] = {6.6, 7.7, 8.8, 9.9, 10.0};// 计算两个双精度浮点型数组的和double doubleSum = sumArray(doubleArray1, doubleArray2);cout << "Sum of doubles: " << doubleSum << endl;return 0;
}

相关文章:

C++学习笔记九--模版

目录 前言 1.函数模版 1.函数模版的概念和定义 2.函数模版的实例化 2.类模版 1.类模版的概念和定义 2.类模版的实例化 3.示例代码 前言 这篇文章介绍下C中的模版&#xff0c;包括函数模版和类模版。 1.函数模版 在编程的过程中&#xff0c;编写函数都会考虑将其写成模版…...

19、差分矩阵

差分矩阵 题目描述 输入一个n行m列的整数矩阵&#xff0c;再输入q个操作&#xff0c;每个操作包含五个整数x1, y1, x2, y2, c&#xff0c;其中(x1, y1)和(x2, y2)表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上c。 请你将进行完…...

wordpress外贸独立站模板

wordpress外贸独立站模板 WordPress Direct Trade 外贸网站模板&#xff0c;适合做跨境电商的外贸公司官方网站使用。 https://www.waimaoyes.com/wangzhan/22.html...

HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP3.0的区别

一、HTTP/1.0 1996年5月&#xff0c;HTTP/1.0版本发布&#xff0c;为了提高系统的效率&#xff0c;HTTP/1.0规定浏览器与服务器只保持短暂的连接&#xff0c;浏览器的每次请求都需要与服务器建立一个TCP连接&#xff0c;服务器完成请求处理后立即断开TCP连接&#xff0c;服务器…...

聚合DNS管理系统v1.0全新发布 域名解析管理系统

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&…...

LabVIEW厂房漏水检测监控系统

LabVIEW厂房漏水检测监控系统 随着信息技术和智能制造的快速发展&#xff0c;对于精密仪器和重要物品存放场所的环境监控日益重要&#xff0c;特别是防止漏水带来的潜在风险。漏水不仅可能导致珍贵资料或仪器的损坏&#xff0c;还可能引发安全事故&#xff0c;给企业和研究机构…...

(3)(3.1) 英特尔Realsense深度摄像头(二)

文章目录 前言 5 配置ArduPilot 6 地面测试&#xff1a;飞行前验证 7 飞行测试 8 实验 9 数据闪存记录 前言 本文介绍如何将英特尔 Realsense 深度摄像头(Intel Realsense Depth Camera)与 ArduPilot 配合使用&#xff0c;以实现避障(obstacle avoidance)。该方法使用在…...

go interface{} 作为函数参数

在 Go 中&#xff0c;将 interface{} 作为函数参数的意义在于使函数接受任意类型的参数。这种参数类型称为空接口&#xff0c;因为它不限制参数的具体类型&#xff0c;可以接受任何类型的值。 使用空接口作为函数参数具有以下几个意义&#xff1a; 通用性&#xff1a; 空接口允…...

Django之REST Client插件

一、接口测试工具介绍 在开发前后端分离项目时,无论是开发后端,还是前端,基本都是需要测试API接口的内容,而目前我们需要开发遵循RESTFul规范的项目,也是必然的(自己不开发前端页面)。 在网上有很多这样的工具,常用的postman,但还是需要下载安装。在这我们介绍一个VSCod…...

java实现UDP数据交互

1、回显服务器 服务器端 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;public class UDP_Server {private DatagramSocket socketnull;public UDP_Server(int port) throws SocketExcepti…...

护眼台灯怎么选看哪些指标?不踩雷护眼台灯十大排名

平常经常面对电子屏幕的上班族、学业负担重的学生族用眼时间都比较长&#xff0c;再加上不健康的用眼习惯&#xff0c;近视人数不断增多。而在这当中&#xff0c;健康的光线也十分重要&#xff0c;良好的光线能够让眼睛更加舒服&#xff0c;用眼负担也会减轻不少&#xff0c;因…...

Web API(六)之正则表达式

Web API(六)之正则表达式 正则表达式正则基本使用元字符边界符量词范围字符类替换和修饰符change 事件判断是否有类正则表达式 正则表达式(Regular Expression)是一种字符串匹配的模式(规则) 使用场景: 例如验证表单:手机号表单要求用户只能输入11位的数字 (匹配)过滤…...

304. 前缀和技巧中的边界值处理

文章目录 题目问题反思 题目 题目如下&#xff0c;其实并不难&#xff0c;属于小而美的前缀和技巧中的体型。因为我之前做过这道题&#xff0c;所以重刷也马上就能写。但是对比我写的和之前看别人写的&#xff0c;明显我的代码不够简洁&#xff0c;一个核心的差异在于对DP数组…...

ios swift5 “Sign in with Apple“(使用苹果登录)怎样接入(第三方登录)集成AppleID登录

文章目录 截图1.在开发者网站的app id中添加Sign in with Apple功能2.在Xcode中添加Sign in with Apple功能3.代码&#xff1a;只有第一次登录的时候可以获取到用户名参考博客chatGPT答案 截图 1.在开发者网站的app id中添加Sign in with Apple功能 1.1 如果你新建app id,记得在…...

时间系列预测总结

转载自&#xff1a;https://mp.weixin.qq.com/s/B1eh4IcHTnEdv2y0l4MCog 拥有一种可靠的方法来预测和预测未来事件一直是人类的愿望。在数字时代&#xff0c;我们拥有丰富的信息&#xff0c;尤其是时间序列数据。 时间序列是指基于时间刻度维度&#xff08;天、月、年等&…...

NineData创始人CEO叶正盛受邀参加『数据技术嘉年华』的技术大会

4月13日&#xff0c;NineData 创始人&CEO叶正盛受邀参加第13届『数据技术嘉年华』的技术大会。将和数据领域的技术爱好者一起相聚&#xff0c;并分享《NineData在10000公里跨云数据库间实时数据复制技术原理与实践》主题内容。 分享嘉宾 叶正盛&#xff0c;NineData CEO …...

nginx访问路径映射资源目录

Nginx映射资源目录是指在Nginx配置文件中设定规则&#xff0c;使得当客户端向Nginx服务器发送请求访问某个URL时&#xff0c;Nginx能够将该URL映射到服务器本地的实际文件目录&#xff0c;从而正确地提供该目录下的静态资源&#xff08;如HTML、CSS、JavaScript、图片、视频等文…...

数据挖掘|序列模式挖掘及其算法的python实现

数据挖掘|序列模式挖掘及其算法的python实现 1. 序列模式挖掘2. 基本概念3. 序列模式挖掘实例4. 类Apriori算法&#xff08;GSP算法&#xff09;4.1 算法思想4.2 算法步骤4.3 基于Python的算法实现 1. 序列模式挖掘 序列(sequence)模式挖掘也称为序列分析。 序列模式发现&…...

3. Django 初探路由

3. 初探路由 一个完整的路由包含: 路由地址, 视图函数(或者视图类), 可选变量和路由命名. 本章讲述Django的路由编写规则与使用方法, 内容分为: 路由定义规则, 命名空间与路由命名, 路由的使用方式.3.1 路由定义规则 路由称为URL (Uniform Resource Locator, 统一资源定位符)…...

论文笔记:Large Language Models as Analogical Reasoners

iclr 2024 reviewer打分5558 1 intro 基于CoT prompt的大模型能够更好地解决复杂推理问题 然而传统CoT需要提供相关的例子作为指导&#xff0c;这就增加了人工标注的成本——>Zero-shot CoT避免了人工标注来引导推理 但是对于一些复杂的任务难以完成推理&#xff0c;例如c…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...