C++模板初阶

文章目录

  • 泛型编程
  • 函数模板
    • 格式
    • 模板调用的是同一个函数吗?
    • 模板的实现原理
    • T不明确
    • 模板实例化的函数和普通函数
  • 类模板
    • 类模板写法
    • 类模板用法
  • 注意事项

泛型编程

假如我们要写一个两数交换的函数,按我们之前学的知识,我们会这样。

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;
}
int main()
{int a = 1, b = 2;//Swap(a, b);Swap(a, b);double c = 1.1, d = 2.22;//Swap(a, b);Swap(c, d);return 0;
}

这是函数重载,按我们的理解,再增加不同的类型的数进行交换又要写一个函数,这样就需要不断的去写函数。
所以这里就引出了我们接下来要说的泛型编程。

函数模板

格式

template<typename T>

template是关键字,
T是模板类型名称,可以随便给。

定义多个模板参数
template<typename x, typename y>

上面交换的代码可以写成这样

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);Swap(a, b);double c = 1.1, d = 2.22;//Swap(c,d);Swap(c, d);return 0;
}

它是针对广泛的类型来进行编程的。T具体的类型是什么我也不知道。

写成这样,无论什么类型的数据进行交换都只需要写这一个模板。

模板调用的是同一个函数吗?

那现在问题来了,Swap(a, b);和Swap(c, d);调用的是同一个函数吗?
通过调试我们发现好像是这样,但是只看这个是不够的,还是看一下汇编,结果发现函数地址不一样,所以肯定不是同一个函数。
在这里插入图片描述

其实我们仔细想想也知道,不可能是同一个,同一个指令是一样的。那函数要建立栈帧,这两个栈帧大小一样吗?
要交换的数的类型不一样,函数栈帧的大小也肯定不一样。

模板的实现原理

那现在又有一个问题,上面两个swap函数调用的是不是模板?
其实不是,这么说吧!Swap(a, b);编译器会判断出a,b的类型是int,继而对模板进行一定的推演,判断出T的类型是int,然后根据模板实例化一个用int数据交换的函数。实际函数调用的不是模板,而是调用的是模板生成的代码。

其实函数一点也没有减少,只是有了模板编译器帮我们生成了。

T不明确

下面看这段代码会报错吗?

T Add(const T& left, const T& right)
{return left + right;
}int main()
{int a1 = 10;double d1 = 10.11;Add(a1, d1);return 0;
}

答案是会报错,这是因为模板再推演实例化的时候出现了歧义,他不知道T的类型是int还是double;

那怎么办呢?
很简单,强制类型转换。这是根据实参传递给形参,自动推演模板类型

Add(a1, (int)d1);
Add((double) a1, d1);

那除了强制类型转换还有没有别的方法呢?
显示实例化

 Add<int>(a1, d1)Add<double>(a1, d1)

模板实例化的函数和普通函数

int Add(int left, int right)
{return left + right;
}// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}

请问能同时存在吗?
能!

那编译器会调用哪个函数?
编译器有个原则,调用谁的成本低就调用谁。很显然如果调用模板实例化的函数需要推演实例化这些东西,所以它会调用普通函数。

那如果非要调用模板实例化的函数呢?
显示实例化

编译器自己选择?
其实编译器非常聪明,它会调用跟它更加匹配的那个函数。

类模板

类模板就是定义一个模板参数,整个类里面都可以用。

那现在问题来了,之前学习的typedef不够用吗?
答案是不够,比如写一个栈,

typedef int STDateType;
class Stack
{
private:STDateType* _a;size_t _top;size_t _capacity;
};
int main()
{Stack st;return 0;
}

现在我栈上既要存储int又要存储double数据就办不到了!

类模板写法

template<class T>
class Stack
{
public:Stack(int capaicty = 4){_a = new T[capaicty];_top = 0;_capacity = capaicty;}~Stack(){delete[] _a;_capacity = _top = 0;}private:T* _a;size_t _top;size_t _capacity;
};

类模板用法

怎么用呢?必须得显示实例化。

int main()
{Stack<int> st1; // intStack<double> st2; // doublereturn 0;
}

注意事项

1.模板的名字不能直接表示类型,加上模板参数才能表示类型

vector <int> v1;

2.类里面如果声明和定义分离怎么写?


class Vector
{~Vector();
};
template<class T>
Vector<T>::~Vector()//不能只指定类名,得指定类型
{delete[] _pData;_pData = nullptr;_size = _capacity = 0;
}

3.类模板声明和定义一定要放在同一个文件。
如果声明和定义分离会出现链接错误。

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

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

相关文章

TypeScript 在前端开发中的应用范围有哪些?

引言 TypeScript是一种由Microsoft开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;添加了静态类型和其他一些面向对象的特性。在前端开发中&#xff0c;TypeScript的应用范围非常广泛&#xff0c;它不仅提供了更好的开发工具支持&#xff0c;还在代码质量、可…

微信小程序基础bug

1.苹果11手机小程序请求数据不显示 设置-》隐私-》分析与改进-》开启 ”与开发者共享“ 2.<navigator>组件回退delta不成功 tabBar 页面是不能实现后退的效果的. 因为, 当我们跳转到 tabBar 页面&#xff0c;会关闭其他所有非tabBar 页面,所以当处于 tabBar 页面时, 无…

SAP ABAP 通过右键菜单完成Tree Control 节点的增删改功能

通过右键菜单完成Tree Control 节点的增删改功能 Tree 节点的增删改是很重要的功能&#xff0c;包括&#xff1a;增加本级节点&#xff0c;增加子节点&#xff0c;修改节点&#xff0c;删 除节点。完成后效果如下&#xff1a; 选择根节点&#xff0c;单击右键&#xff0c;弹…

peertalk Usbmux 资料收集与整理

Usbmux - The iPhone Wiki Usbmux During normal operations, iTunes communicates with the iPhone using something called “usbmux” – this is a system for multiplexing several “connections” over one USB pipe. Conceptually, it provides a TCP-like system –…

高压功率放大器产品参数及优势有哪些

高压功率放大器是一种关键性能器件&#xff0c;常用于不同领域的应用&#xff0c;包括声音放大、通信系统、电力传输等。以下是关于高压功率放大器产品参数和优势的详细介绍。 一、高压功率放大器的产品参数 输入/输出电压范围&#xff1a;高压功率放大器通常能够承受较高的输入…

金融科技Q3增长密码:结构调优,质量增厚

来源 | 镭射财经&#xff08;leishecaijing&#xff09; 金融科技上市公司三季度交出规模突破、业绩稳增的答卷&#xff0c;为四季度审慎经营、风控优化创造了空间。 从三季度业绩数据看&#xff0c;金融科技行业延续了前两个季度的增长势头&#xff0c;主要金融科技上市公司…

每日汇评:由于美国ADP就业数据疲弱,黄金的反弹可能会延续

在美元全面回落的背景下&#xff0c;金价在2020美元附近跃跃欲试。&#xff1b; 黄金价格的上涨似乎受到美债正收益率的限制&#xff1b; 黄金价格等待美国ADP就业数据获得新的提振&#xff0c;因为技术支撑仍然存在&#xff1b; 周三早盘&#xff0c;金价在2020美元附近小幅反…

处理数据时注意事项

数据安全&#xff1a; 历史数据兼容 越权访问 数据量级 操作记录

完美解决:wget命令下载时遇到“错误 308:Permanent Redirect。”

目录 1 问题 2 解决方法 1 问题 使用wget命令下载时候遇到&#xff1a; --2023-12-02 20:36:08-- http://mirrors.jenkins.io/war-stable/latest/jenkins.war 正在解析主机 mirrors.jenkins.io (mirrors.jenkins.io)... 20.7.178.24, 2603:1030:408:5::15a 正在连接 mirror…

电子版简历模板精选5篇

电子版简历模板模板下载&#xff08;可在线编辑制作&#xff09;&#xff1a;做好简历&#xff0c;来幻主简历。 电子版简历1&#xff1a; 求职意向 求职类型&#xff1a;全职 意向岗位&#xff1a;ERP咨询顾问 意向城市&#xff1a;北京市 薪资要求&#xff1a;…

ROS 欧拉角

在ROS中&#xff0c;欧拉角&#xff08;Euler angles&#xff09;通常用于描述一个物体相对于参考坐标系的旋转。这种表示方法基于三个连续的旋转角度&#xff0c;每个角度对应于绕着特定轴线&#xff08;通常是XYZ轴或ZYZ轴等不同顺序&#xff09;的旋转。 ROS中&#xff0c;…

波长和陡度 现货黄金强弱分析中yyds

按照强势的那一方做交易&#xff0c;不和弱势的一方为伍&#xff0c;这是我们做现货黄金投资的哲学&#xff0c;顺势交易也是建立在这样的基础之上的。要判断现货黄金是强势还是弱势&#xff0c;除了借助技术指标以外&#xff0c;通过看走势本身也可以实现&#xff0c;下面我们…

python 协程asyncio详解

协程 协程就是告诉Cpython解释器&#xff0c;你不是nb吗&#xff0c;不是搞了个GIL锁吗&#xff0c;那好&#xff0c;我就自己搞成一个线程让你去执行&#xff0c;省去你切换线程的时间&#xff0c;我自己切换比你切换要快很多&#xff0c;避免了很多的开销。 协程的本质就是…

【Docker】从零开始:13.Docker安装tomcat

Docker】从零开始&#xff1a;13.Docker安装Tomcat 下载Tomcat镜像启动Tomcat镜像新版本Tomcat修改访问Tomact首页 下载Tomcat镜像 [rootdocker ~]# docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat 0e29546d541c: Pull complete 9b829c7…

uniapp横向滚动示例

目录 插件市场案例最后 插件市场 地址 案例 地址 最后 感觉文章好的话记得点个心心和关注和收藏&#xff0c;有错的地方麻烦指正一下&#xff0c;如果需要转载,请标明出处&#xff0c;多谢&#xff01;&#xff01;&#xff01;

简述IO流的使用以及使用时需要注意的事项

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍介绍IO流的使用以及使用时需要注意的事项以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可…

程序员都在收藏的免费好用API接口

AI绘画-Mid Journey&#xff1a;使用 Midjourney 目前全球领先的图片大模型&#xff0c;其能根据输入文字提供极其优秀的AI绘画作品。AI绘画-Stable Diffusion&#xff1a;通过AI 生成图片&#xff0c;包括图生文、文生图等。IP归属地-IPv4区县级&#xff1a;根据IP地址查询归属…

11月榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年11月飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站U…

Linux Console快捷键

Ctrl C&#xff1a;终止当前正在运行的程序。 Ctrl D&#xff1a;关闭当前终端会话。 Ctrl Z&#xff1a;将当前程序放入后台运行。 Ctrl L&#xff1a;清除当前屏幕并重新显示命令提示符。 Ctrl R&#xff1a;在历史命令中进行逆向搜索。 Ctrl A&#xff1a;将光标移动到…

java--泛型方法、通配符、上下限

1.泛型方法 2.通配符 就是"?"&#xff0c;可以在"使用泛型"的时候代表一切类型&#xff1b;E T K V是在定义泛型的时候使用。 3.泛型的上下限 ①泛型上限&#xff1a;? extends Car&#xff1a;? 能接收的必须是Car或者其子类 ②泛型下限&#xff1…