【C++】模版(一)

news2024/12/22 19:02:18

泛型编程、模版(一):

1.泛型编程:

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;
}

【思考】

原本的函数重载,我只是改了函数参数个数和参数类型,我们需要为不同的重载函数写同样的代码

❓我们可以将他们写在一起吗?

可以的,用泛型编程!template<class T>后面就写正常的函数就可以了

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

❓为什么不能直接函数重载,而要弄一个泛型编程呢?

  • 就拿swap函数为例,当参数类型变为char类型,我们需要写一个重载函数,而当参数类型为int类型又要写一个重载函数。
  • 代码的可维护性比较低,一个出错可能所有的重载均出错

那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?

image-20230412111136271

如果在C++中,也能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件

(即生成具体类型的代码),那将会节省许多头发。巧的是前人早已将树栽好,我们只需在此乘凉。

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

image-20230412111234186

1.1调用泛型编程时,不同参数的地址是否一样?

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

	double c = 1.1, d = 1.2;
	Swap(c, d);
	return 0;
}

这两个swap函数是不是调用同一个函数呢?

显然,这两个函数的地址不一样,这两个并不是同一个函数image-20230407004416665

1.2泛型编程的底层原理:

编译器会帮我们实例化出代码,该有两份还是有两份,三份代码还是三份

image-20230407005431834


2.模版:

模版分为两种:一种是函数模版,一种是类模板

2.1函数模版:

函数模板概念:

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定
类型版本。

2.1.1函数模板的语法:

template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}

模版有多个参数

template<class x,class y>
void swap(x& a, y& b)
{
	;
}

template<class T>这里的class可以用什么替代?

可以用typename,但是不可以用struct替代(报错)

image-20230407010431601

只要是模版中定义的参数,函数都可以使用

Swap这个函数库里面有写了一个函数模版

image-20230407010140238

template<typename T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	int a = 1, b = 2;
	double c = 1.1, d = 1.2;
	cout<<Add(a, (int)d)<<endl;
	cout<<Add((double)a, d)<<endl;
	cout << Add<int>(a ,d) << endl;
	cout << Add<double>(a ,d) << endl;
	return 0;
}

Swap(a, d);这个能不能编译通过?

答案是不可以的,编译器不能准确的推演类型,如何解决呢?

1.强制类型转换

2.显示实例化

image-20230407012223361

当函数同时存在,他会调用哪一个呢?

显然,编译器回调我们写的

template<typename T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int Add(int left, int right)
{
	return left + right;
}
int main()
{
	int a = 1, b = 2;
	Add(a, b);
	return 0;
}

image-20230407012954214

那如果我们想要调用模版怎么办?

Add<int>(a, b);这样就可以了

2.2类模板:

2.2.1类模板的语法:

template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
template <class T>
class Stack
{
public:
	Stack(int capacity = 4)
	{
		_a = new T[capacity];
		_top = 0;
		_capacity = capacity;
	}
	~Stack()
	{
		delete[] _a;
		_capacity = _top = 0;
	}
private:
	T* _a;
	size_t _top;
	size_t _capacity;
};
int main()
{
	Stack <int>st1;//int
	Stack<double> st2;//double
	return 0;
}

类模版中的函数如果要类外写,怎么写

// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{
if(_pData)
delete[] _pData;
_size = _capacity = 0;
}
Stack <int>st1;//int
Stack<double> st2;//double
return 0;

}


类模版中的函数如果要类外写,怎么写

```cpp
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{
if(_pData)
delete[] _pData;
_size = _capacity = 0;
}

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

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

相关文章

电脑软件:office文档密码了怎么办,看完你就能自己找回了

Word、Excel、PPT作为大家日常办公的使用最频繁的办公软件。对于一些涉及个人隐私或者涉及企业机密性的文档文件&#xff0c;我们经常会给自己的文档加上密码。 但有时候文档时间比较久了、或者密码太多了&#xff0c;有时候我们会把文档的密码给忘记了&#xff0c;如果密码忘…

Shell练习

一、题目 1、编写函数&#xff0c;实现打印绿色OK和红色FAILED 判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED 2、编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误 3、编写函数实现两个数字做为参数&#xff0c;返回最…

【大数据之Hadoop】十一、MapReduce之Shuffle、MapTask、ReduceTask工作机制

1 Shuffle机制 对于排序而言分为两个阶段&#xff0c;MapTask后和ReduceTask前。 2 MapTask工作机制 MapTask并行度由切片个数决定&#xff1b;切片个数由切片大小&#xff08;切片大小取决于块大小、maxsize&#xff08;Long的最大值&#xff09;和minsize&#xff08;默认为…

【华为机试真题详解JAVA实现】—字符串通配符

目录 一、题目描述 二、解题代码 一、题目描述 问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。 要求: 实现如下2个通配符: *:匹配0个或以上的字符(注:能被*和?匹配的字符仅由英文字母和…

为一副通用纸牌设计数据结构

为一副通用纸牌设计数据结构 大家好&#xff0c;我是易安&#xff0c;今天我们来聊一道笔试题&#xff0c;这也是我曾经面试华为时做过的题&#xff0c;今天分享给大家。 题目&#xff1a; 如何设计一个通用的扑克牌数据结构&#xff1f;请解释如何继承它来实现特定的扑克游戏…

wps 不显示公式_当Excel中使用函数不显示结果只显示公式时,该怎么解决呢?

在使用Excel过程中&#xff0c;有时候Excel中使用函数后&#xff0c;不显示结果只显示公式。 如下面使用vlookup函数时&#xff0c;只显示公式不显示结果。 遇到这种情况我们该怎么处理呢&#xff1f; 接下来&#xff0c;介绍几种造成该情况的原因以及相对应的解决方法。 1.如果…

BarTender.Application COM 多次调用引发后台进程数不断增加的问题

引用文章方法测试&#xff0c;目前未发现问题. Closing Instance Of Bartender – BarTender Support Portal (seagullscientific.com) Closing Instance Of Bartender FollowFollowed by one person Legacy Poster 9 years ago Hello again, Ive got BarTender automating…

LLM:Vicuna 7B模型简单部署体验

0、引入1、保存权重文件到阿里云盘2、部署环境3、上传权重文件到30904、下载安装源码4.1 下载编译安装源码4.2 安装5、开始使用6、直接使用我的镜像立即开启人机对话Debug&#xff1a;可能的报错0、引入 随着ChatGPT的火热&#xff0c;科技公司们各显神通&#xff0c;针对大语…

设计模式之中介者模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、中介者模式是什么&#xff1f; 中介者模式是一种行为型的软件设计模式&#xff0c;也称为仲裁者模式&#xff0c;顾名思义&am…

nginx--基本配置

目录 1.安装目录 2.文件详解 2.编译参数 3.Nginx基本配置语法 1./etc/nginx/nginx.conf 2./etc/nginx/conf.d/default.conf 3.启动重启命令 4.设置404跳转页面 1./etc/nginx/conf.d/default.conf修改 ​2. 重启 5.最前面内容模块 6.事件模块 1.安装目录 # etc cd …

排序-时间复杂度

技巧&#xff1a;先处理 内层 一次排序&#xff0c;在处理外面 直接插入排序 升序 最坏(遇到降序)&#xff1a;O(N^2) 等差数列 123…(n-1) (n^2-n)/2 最好(有序) O(N) 希尔排序 gap 任何数字/2都是1 gap/3 1 保证gap最后是1 gap是多少 就分了多少组,每组数据可能少一点&…

根文件系统移植:bulidroot根文件系统搭建详细步骤

bulidroot根文件系统 文章目录bulidroot根文件系统1.buildroot 下载2 配置 buildroot1、配置 Target options2、配置 Toolchain3、 配置 System configuration4、配置 Filesystem images5、 禁止编译 Linux 内核和 uboot6、配置 Target packages3 编译 buildroot4 buildroot 根…

第一章 计算机网络概述

计算机网络基本概念 计算机网络是计算机技术与通信技术相互融合的产物计算机网络是互连的、自治的计算机的集合 自治——互连的计算机系统彼此独立&#xff0c;不存在主从或者控制与被控制关系互连——利用通信链路连接相互独立的计算机系统 目前最大的、应用最广泛的计算机网…

函数栈帧的创建和销毁(带你进一步深入理解函数的执行流程)

本文主题 什么是函数栈帧&#xff1f; 理解函数栈帧能解决什么问题&#xff1f; 函数栈帧的创建和销毁解析 1. 什么是函数栈帧 &#xff1f; 我们在写C语言代码的时候&#xff0c;经常会把一个独立的功能抽象为函数&#xff0c;所以C程序是以函数为基本单位的。 那函数是如何…

人人都是数据分析师-数据分析之数据图表可视化(上)

BI报表、运营同学的汇报报告中数据图表大多为 表格、折线图、柱状图和饼图&#xff0c;但是实际上还有很多具有代表性的可视化图表&#xff0c;因此将对常见的可视化图表进行介绍&#xff0c;希望这些图表可视化方法能够更好的提供数据的可用性。 导语 数据是我们在数据分析工…

通过1个IP地址同时采集2台西门子S7200 Smart的数据

一、应用场景 制药厂的颗粒包装机&#xff0c;控制系统由2台西门子S7200 Smart的PLC和1台昆仑通泰MCGS的触摸屏组成。现在MES管理系统&#xff0c;需要采集设备的数据&#xff0c;只提供一个IP地址&#xff0c;且IP地址和原系统不在同一个网络段内。 二、原系统架构 2台西门子S…

浅析DNS Rebinding

0x01 攻击简介 DNS Rebinding也叫做DNS重绑定攻击或者DNS重定向攻击。在这种攻击中&#xff0c;恶意网页会导致访问者运行客户端脚本&#xff0c;攻击网络上其他地方的计算机。 在介绍DNS Rebinding攻击机制之前我们先了解一下Web同源策略&#xff0c; Web同源策略 同源策略…

智慧校园人员定位系统解决方案

人员定位是安全管理中最重要的一个环节&#xff0c;尤其是石化、矿业、电力、建筑等高危行业&#xff0c;人员安全管理更是重中之重&#xff0c;除了工业领域&#xff0c;其它领域也需要人员安全管理&#xff0c;比如&#xff1a;学校、医院、养老院、物业、环卫等。下面我们以…

SpringSecurity之基本原理——过滤器加载过程

前言 前一篇讲解了SpringSecurity的过滤器链的基本只是&#xff0c;今天我们就要进入过滤器&#xff0c;看看其加载过程是如何的&#xff1f; 相信认真度过第一篇文章的小伙伴还记得&#xff0c;我说在SpringBoot出现后&#xff0c;帮助我们省去了那些繁琐的配置&#xff0c;…

2023年MathorCup数模A题赛题

A 题 量子计算机在信用评分卡组合优化中的应用 在银行信用卡或相关的贷款等业务中&#xff0c;对客户授信之前&#xff0c;需要先通过 各种审核规则对客户的信用等级进行评定&#xff0c;通过评定后的客户才能获得信 用或贷款资格。规则审核过程实际是经过一重或者多重组合规则…