【详细了解c++模板】

2023-11-08

前言

打怪升级:第40天
在这里插入图片描述

在c++的开始阶段我们了解到了函数重载,函数重载可以允许我们使用同名函数,方便我们编写那些功能类似但参数不同的函数,例如:

void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}

void Swap(double& x, double& y)
{
	double tmp = x;
	x = y;
	y = tmp;
}

int  main()
{
	int a = 10, b = 20;
	cout << "a = " << a << ", b = " << b << endl;
	Swap(a, b);
	cout << "a = " << a << ", b = " << b << endl;
	double c = 10.11, d = 20.22;
	cout << "c = " << c << ", d = " << d << endl;
	Swap(c, d);
	cout << "c = " << c << ", d = " << d << endl;
	return 0;
}

在这里插入图片描述在这里插入图片描述

因此,我们祖师爷就在想,能不能我们只自己写一个“模具”出来,之后具体需要什么类型由编译器来判断并且复刻出可以使用的函数?
就像我们的印刷机 – 有一个原样,想要得到它的复制品就轻而易举,这样不仅帮助程序员们节省了对类似代码的拷贝与维护,并且还可以少掉许多头发。

一、泛式编程

泛式编程:编写与类型无关的函数,是代码复用的一种手段,模板是泛式编程的基础。
在这里插入图片描述

函数模板

函数模板代表一个函数家族,与类型无关,在使用时根据参数类型实例化出可执行函数(这些都是编译器做的)。

  • 函数模板
    template<typename T1, tempname T2, …tempname Tn>
    返回值 函数名 (T1 data1, T2 data2 …)
    { }
//   template<typename T>
//   template<typename Type> ...  这个类型名怎么写都可以
template<typename T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

int  main()
{
	int a = 10, b = 20;
	cout << "a = " << a << ", b = " << b << endl;
	Swap(a, b);
	cout << "a = " << a << ", b = " << b << endl;
	double c = 10.11, d = 20.22;
	cout << "c = " << c << ", d = " << d << endl;
	Swap(c, d);
	cout << "c = " << c << ", d = " << d << endl;
	return 0;
}

这里是引用

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

类模板

  • 类模板格式


template<class T1, class T2, ..., class Tn>
class 类模板名
{
 // 类内成员定义
};
template<class T>  //  该模板:T 可以在整个类中使用
class A
{
public:
	 
	A(int d)
		:_d(d)
	{
		cout << "A" << endl;
	}

	void Print(T val)
	{
		cout << val << " " << _d << endl;
	}

	~A()
	{
		cout << "~A" << endl;
	}

private:
	T _d;
};


int main()
{
	A<int> a(20);
	a.Print(5);
	
	return 0;
}

这里是引用



template<class T>
class A
{
public:
	 
	A(int d)
		:_d(d)
	{
		cout << "A" << endl;
	}

	void Print(T val);  //   类外声明

	~A()
	{
		cout << "~A" << endl;
	}

private:
	T _d;
};

template<class T>     //  类模板的成员函数在类外声明需要加 模板参数列表
void A<T>::Print(T val) 
{
	cout << val << " " << _d << endl;
}


int main()
{
	A<int> a(20);
	a.Print(5);
	
	return 0;
}

这里是引用

模板这方面在我们c++中可谓非常之重要,了解c++的朋友应该都听说过stl的鼎鼎大名,stl全称为Standard Template Library(标准模板库),
它里面的vector,set以及string等等都是类模板,其中string比较特殊:数据类型只能是char,因此 设计stl 的大佬直接在库中进行了声明:typedef basic_string string;
所以我们在使用string模板时不需要写出模板类型,例如:string<char> str; 而是可以直接使用 string str;
不过其他类模板使用之前就需要声明类型了,例如:
vector<int> array; vector<double> array; set<int>s;等等。


总结

  1. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换,例如上面的add模板,两个参数类型需要保持相同;
  2. 声明一个模板只能够在下方的那一个函数或者类中使用,在其他地方编译器无法识别 , 换句话说就是:每次使用模板都需要进行声明
  3. 函数模板的模板类型可以交给编译器自行推导也可以显示声明,而类模板必须显示声明类型
  4. 类模板实例化与函数模板实例化不同,类模板实例化需要显示声明模板类型,类模板名字不是真正的类,实例化的结果才是真正的类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【详细了解c++模板】 的相关文章

随机推荐

  • 树莓派上开热点(AP)的三种办法实践结果V2

    树莓派上开热点 AP 的三种办法实践结果 date 2021 08 02 lastmod 2021 09 19 背景 UC2 项目中树莓派大脑和子模块有两种方式连接方式 一种是采用 I2C 总线通过 Arduino 做主从 一种是走 WIF
  • Spring(二)IoC 容器

    IoC 容器 Spring 容器是 Spring 框架的核心 容器将创建对象 把它们连接在一起 配置它们 并管理他们的整个生命周期从创建到销毁 Spring 容器使用依赖注入 DI 来管理组成一个应用程序的组件 这些对象被称为 Spring
  • Arcesium面试体验

    回合 1 能力和技术回合 第一轮有20个Aptitude MCQ 20分钟 和15个技术MCQ 15分钟 分别带有 1和 0 25标记方案 MCQ涵盖了所包含的主题 DSA 操作系统 C C Java基础知识 此后 有2个编码问题 45分钟
  • FFT(快速傅里叶变换)算法

    文章目录 功能 一次FFT的功能 一次IFFT的功能 总体功能 前置技能 多项式的阶 多项式的系数表达式 多项式的点值表达式 复数 复数的基本单位 复数的运算 复平面 复根 定义 几个性质 求多项式乘积的基本步骤 FFT 递归版FFT 核心
  • 【经验分享】Hydra(爆破神器)使用方法

    这个也是backtrack下面很受欢迎的一个工具 参数详解 R 根据上一次进度继续破解 S 使用SSL协议连接 s 指定端口 l 指定用户名 L 指定用户名字典 文件 p 指定密码破解 P 指定密码字典 文件 e 空密码探测和指定用户密码探
  • 大数据Hadoop完全分布式及心得体会

    文章目录 前言 认识hadoop 根据所学知识完成作业 并总结本学期心得体会 一 认识hadoop 二 一课一得作业讲解 实现步骤 1 搭建集群 2 模拟生成新能源车辆数据编写一个程序 3 最终部署 将这些数据写到HDFS中 三 学习收获
  • 概率论中 PDF,PMF,CDF的含义

    概率论中 PDF PMF CDF的含义 在概率论中 我们经常能碰到这样几个概念PDF PMF CDF 这里就简单介绍一下 PDF 概率密度函数 probability density function 在数学中 连续型随机变量的概率密度函数
  • vue的el-form-item标签的label展示名称左右对齐

    vue的el form item是下面的样子
  • 报错Failed to load resource: net::ERR_FILE_NOT_FOUND--浏览器设置跨域

    浏览器报错Failed to load resource net ERR FILE NOT FOUND代表此应用运行需要做跨域 推荐使用火狐浏览器做跨域 之后也用火狐访问 在地址栏输入 about config 点击接受风险并继续 输入se
  • xxl-rpc remoting error(connect timed out), for url : http://172.26.112.1:9999/run

    查看你部署的xxl job admin程序是否部署在外网的 如果是在外网 外网访问不到本地局域网主机 可以使用内网穿透 然后在执行器那里不使用自动获取地址 手动把穿透的地址填进去
  • 1477. 找两个和为目标值且不重叠的子数组

    1477 找两个和为目标值且不重叠的子数组 题目描述 样例1 样例2 样例3 样例4 示例 5 提示 解题思路 代码实现 题目描述 给你一个整数数组 arr 和一个整数值 target 请你在 arr 中找 两个互不重叠的子数组 且它们的和
  • 智慧疫情防控平台(图形化编程mind+)

    本文系湛江市第十七中学星火创客团队及岭南师范学院物联网俱乐部原创部分参赛项目 转载请保留声明 前言 本文章将教会大家如何使用图形化编程制作简易的智慧疫情防控平台 这个项目非常适合于低年级的学生去实践 锻炼自己的逻辑思维和积累一定的项目开发经
  • 嘉兴市人才网即时招聘栏目Ajax动态翻页爬虫练习

    声明 代码仅供技术学习交流 不作其他用途 即时招聘 https www jxrsrc com Index MoreInfo aspx TypeID 34 打开页面后拉到底下点下一页翻页发现浏览器中的地址没有发生变化 分析后这个网站是用ASP
  • 区块链技术在食品供应链领域的应用

    现如今 食品供应链的复杂程度变得越来越高 由此对于食品生产者 供应商和零售店 很难确保整个供应链上产品的真实性 食品安全的问题包含跨供应链认证和食品问题的普及 都是因为缺乏数据和可追踪性 导致事情更加不好 如果需要查询真正的原因 现在则需要
  • MyBatis映射关系

    目录 数据库的配置 一 映射关系一对一 1 映射关系 1 对 1 基本介绍 2 映射关系 1 对 1 映射方式 3 应用实例 3 1方式一 方式二 重点解析 注解的方式实现 注意事项和细节 二 映射关系多对一 1 基本介绍 2 注意细节 3
  • APAC 2013 部分题解

    目录 A The Alphabet Sticker C Increasing Shortest Path D Cup of Cowards E Balloons Colors F NASSA s Robot G The Stones Gam
  • 计算机视觉与深度学习-卷积神经网络-纹理表示&卷积神经网络-卷积神经网络-[北邮鲁鹏]

    这里写目录标题 参考文章 全连接神经网络 全连接神经网络的瓶颈 全连接神经网络应用场景 卷积神经网络 卷积层 CONV 卷积核 卷积操作 卷积层设计 卷积步长 stride 边界填充 特征响应图组尺寸计算 激活层 池化层 POOL 池化操作
  • 基于HSV颜色空间用OpenCV-Python给照片换底

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 在 基于RGB颜色空间用OpenCV Python给蓝底照片换底 链接地址 https blog csdn net LaoYuanP
  • Kali 2.0安装之后的简单设置

    使用的是Kali Linux 2 0 0 vm amd64 下图是安装后的桌面 一 汉化 Applications gt Usual applications gt system tool gt preferences gt setting
  • 【详细了解c++模板】

    目录 前言 一 泛式编程 函数模板 类模板 总结 前言 打怪升级 第40天 在c 的开始阶段我们了解到了函数重载 函数重载可以允许我们使用同名函数 方便我们编写那些功能类似但参数不同的函数 例如 void Swap int x int y