从零开学C++:模板初阶

news2024/9/25 1:14:00

引言:C语言当中,如果我们想要实现一个能计算整数和浮点数的计算器时,我们都需要根据不同的返回类型和参数类型创建许多个形式极其相似的函数,非常的麻烦,而在C++中,我们将会引入模版的知识概念,这个问题就会迎刃而解了!

更多有关C语言,数据结构和C++的知识详解可前往个人主页:计信猫

一,函数模板

1,概念

        函数模板是一个大家族,它与类型无关,在使用时被参数化,会根据参数的类型自动生成对应的函数

2,格式

格式:
template <class 类型名1,class 类型名2…>

        当然此时class也可以用typename来代替,两者的效果是一样的。所以有了以上的知识支持,那么我们就尝试来写一下我们的计算器模板吧!

//T表示参数的类型,会根据传的参数而改变
template <class T>
T ADD(const T& a, const T& b)
{
	return a + b;
}

         此时该模板会根据函数的参数来进行对模板函数的实例化

3,实例化

Ⅰ,隐式实例化

        隐式实例化非常的简单,就是上边我们所讲的例子,让编译器根据实参的类型来确定模板参数的实际类型

Ⅱ,显式实例化

        让我们来看下面一个例子:

template <class T>
T ADD(const T& a, const T& b)
{
	return a + b;
}
int main()
{
	int a = 1;
	double b = 2.1;
	ADD(a, b);
	return 0;
}

        此时,编译器就会报出错误,因为无法识别T的类型为int,还是double,此时我们就需要用到显式实例化

法一:ADD<int>(a,b)——>此时两个类型的变量都被强转为int

法二:ADD(a,(int)b)——>此时只有b的类型被转换为int

4,匹配原则

函数模板在使用时遵循着以下几点原则:

        1,一个非模板函数可以和一个同名函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数

        2,对于非模板函数和同名函数模板,如果其他条件都相同,在调用时会优先调用非模板函数若该模板可以产生一个具有更好匹配的函数,那么将选择模板

template <class T1,class T2>
T2 ADD(const T1& a, const T2& b)
{
	return a + b;
}
int ADD(const int& a, const int& b)
{
	return a + b;
}
int main()
{
	int a1 = 1;
	int a2 = 1;
	double b = 2.1;
	ADD(a1, a2);//此时就会调用非模板函数
	ADD(a1, b);//此时就会调用模板函数
	return 0;
}

        3,模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。

二,类模板

1,格式

        在我们前边学习了函数模板的格式之后,其实类模板我们也可以举一反三了。如下,我们就使用模板定义一个栈:

template<class T>
class Stack
{
public:
	//构造函数
	Stack(int top,int capacity)
		:_a(new T[4])
		,__top(top)
		,_capacity(capacity)
	{}
	//拷贝构造函数
	Stack(const stack& s1)
	{
		_a = new T[s1._capacity];
		memcpy(_a, s1._a, sizeof(T) * s1._top);
		_top = s1._top;
		_capacity = s1._capacity;
	}
	//析构函数
	~Stack()
	{
		delete[] _a;
		_a = NULL;
		_top = _capacity = 0;
	}
private:
	T* _a;
	int _top = 0;
	int _capacity = 4;
};

2,实例化

        类模板的实例化和函数模板的实例化不同。类模板实例化需要在类模板名字之后跟上<>,        然后将实例化的类型放在<>中即可。类模板名字不是真正的类,而实例化的结果才是真正的类

//Stack是类名,Stack<int>是类型
Stack<int>st1;
Stack<double>st2;
          类模板中都为显式实例化。 

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

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

相关文章

模型优化—输入特征归一化处理

一、normalization 归一化&#xff08;规范化&#xff09;是对输入数据进行处理&#xff0c;使其满足某种规范。 前提&#xff1a;线性变换&#xff0c;不会改变原始数据的数值顺序。 假设原值分布在第一象限的某区间&#xff0c;并且x轴间距较广&#xff08;离散&#xff0…

QT动态添加布局以及删除布局

具体代码示例如下 &#xff1a; QHBoxLayout* hLayout new QHBoxLayout;hLayout->addWidget(new QLabel("444"));hLayout->addWidget(new QLineEdit("444"));hLayout->addWidget(new QPushButton("444"));layout->addLayout(hLayou…

Axure Web端元件库:从Quick UI到500+组件的飞跃

在快速变化的数字世界中&#xff0c;产品设计不仅仅是功能的堆砌&#xff0c;更是用户体验的精心雕琢。原型设计作为产品开发过程中的关键环节&#xff0c;其重要性不言而喻。Axure&#xff0c;作为业界领先的原型设计工具&#xff0c;凭借其强大的交互设计和丰富的功能&#x…

Masked Autoencoders for Point CloudSelf-supervised Learning

关于SSL中的MAE方法。 摘要 文章介绍了一种新的技术&#xff0c;叫做MAE&#xff0c;在帮助计算机自己学习理解语言和图片方面做得非常好。受到这个技术的启发&#xff0c;它用在了点云上。点云是一堆代表三维空间中某些点的数据&#xff0c;这种数据有时候会有点难处理&…

机器学习笔记-02-基础线性算法认识(问题-解答自查版)

前言 以下问题以Q&A形式记录&#xff0c;基本上都是笔者在初学一轮后&#xff0c;掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系&#xff0c;也适合做查漏补缺和复盘。 本文可以让读者用作自查&#xff0c;答案在后面&#xff0…

尚庭公寓开发(二)

任何二进制和子网掩码进行一个与运算 得到是子网ip的话就是属于子网ip的范围 任何数字和一做与运算都是他本身 和0做运算都是0 所以要得到子网ip的话他的前面必须是 192.168.200 最后是0-255之间的范围 0不能取 0是子网本身 255也不能用 因为他是广播地址 真正可以使用 的范…

[数据集][目标检测]躺坐站识别检测数据集VOC+YOLO格式9488张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9488 标注数量(xml文件个数)&#xff1a;9488 标注数量(txt文件个数)&#xff1a;9488 标注…

Python升级打怪—Django入门

目录 一、Django简介 二、安装Django 三、创建Dajngo项目 (一) 创建项目 (二) 项目结构介绍 (三) 运行项目 (四) 结果 一、Django简介 Django是一个高级Python web框架&#xff0c;鼓励快速开发和干净、实用的设计。由经验丰富的开发人员构建&#xff0c;它解决了web开…

机器学习 | 分类算法原理——感知机

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的内积继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享感知机这一回归算法基础。本章的回归算法基础基于《基于图像大小进行分类》项目&#xff0c;欢迎大家交流学习&#xff01; 目录 一、感知机…

阿里云-物联网平台-IoT设备MQTT通信

阿里云-物联网平台-IoT设备MQTT通信 登录阿里云物联网平台创建产品添加设备查看设备客户端登录 登录阿里云 阿里云 注册账号&#xff0c;实名认证这些按提示操作即可不在赘述。 物联网平台 选择产品》物联网》物联网平台 进入管理控制台界面 开通服务 选择开通公共实例测试环…

oracle中存储过程的写法

存储过程常规语法&#xff1a; 实际业务例子&#xff1a; CREATE OR REPLACE TRIGGER "TRI_B00_02_ONLY_GUID" BEFORE/AFTER INSERT OR UPDATE OR DELETE ON B00_02 FOR EACH ROW declare t_guid varchar2(300) : ; --GUID t_cnt int : 0; BEGIN t_guid : :NEW…

Oracle核心进程详解并kill验证

Oracle核心进程详解并kill验证 文章目录 Oracle核心进程详解并kill验证一、说明二、核心进程详解2.1.PMON-进程监控进程2.2.SMON-系统监控进程2.3.DBWn-数据库块写入进程2.4. LGWR-日志写入器进程2.5. CKPT-检查点进程 三、Kill验证3.1.kill ckpt进程3.2.kill pmon进程3.3.kill…

Spring MVC笔记

Java 版本: JDK17 Eclipse: eclipse-jee-2023-12-R-win32-x86_64.zip Tomcat 10 JDK17采用springframework 6 *必须考虑兼容性问题&#xff0c;所以JDK 和spring framework不要乱搭配 初步创建Maven Project 安装包 修改poem.xml <dependency><groupId>org.sprin…

Spark实时(五):InputSource数据源案例演示

文章目录 InputSource数据源案例演示 一、​​​​​​​File Source 1、读取text文件 2、读取csv文件 3、读取json文件 二、Socket Source 三、Rate Source InputSource数据源案例演示 在Spark2.0版本之后&#xff0c;DataFrame和Dataset可以表示静态有边界的数据&am…

客户服务知识库最佳实践 7 个步骤

介绍 每个公司的声誉都依赖于其客户。 如果全世界都向你敞开了大门&#xff0c;但你最终在与客户打交道方面做得很糟糕&#xff0c;那么消息就会传出去&#xff0c;无论你的捕鼠器有多好&#xff0c;你都会失去销售。 正如营销依赖于与潜在客户的关系一样&#xff0c;公司的…

【Linux】信号3——信号的捕捉

1.信号的捕捉 我们都说信号被收到了&#xff0c;可能不会立马处理 信号是什么时候被处理的呢&#xff1f; 前提是我们得知道自己收到了信号&#xff0c;进程就得在合适的时候去查自己的pending表和block表&#xff0c;这些属于内核数据结构&#xff0c;进程一定要处于内核态&a…

Easy es问题总结

官网教程&#xff1a;https://www.easy-es.cn/pages/ac41f0/#settings 一 测试项目 1 pom <dependencies><!-- 排除springboot中内置的es依赖,以防和easy-es中的依赖冲突--><dependency><groupId>org.springframework.boot</groupId><artifa…

Java语言程序设计基础篇_编程练习题*15.26 (改变透明度)

*15.26 (改变透明度) 重写编程练习题15.24&#xff0c;当球摆动的时候改变球的透明度 思路&#xff1a;很简单&#xff0c;改写编程练习题15.24&#xff0c;为小圆Circle添加一个FadeTransition&#xff0c;再把暂停和开始方法设置在鼠标事件中 代码示例&#xff1a;编程练习…

基于多种机器学习的豆瓣电影评分预测与多维度可视化【可加系统】

有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 在本研究中&#xff0c;我们采用Python编程语言&#xff0c;利用爬虫技术实时获取豆瓣电影最新数据。通过分析豆瓣网站的结构&#xff0c;我们设计了一套有效的策略来爬取电影相关的JSON格式数据。…

鸿蒙(HarmonyOS)自定义Dialog实现时间选择控件

一、操作环境 操作系统: Windows 11 专业版、IDE:DevEco Studio 3.1.1 Release、SDK:HarmonyOS 3.1.0&#xff08;API 9&#xff09; 二、效果图 三、代码 SelectedDateDialog.ets文件/*** 时间选择*/ CustomDialog export struct SelectedDateDialog {State selectedDate:…