C++模板初阶(函数模板、类模板)知识点+完整思维导图+实操图+深入细节通俗易懂建议收藏

news2024/12/23 18:07:54

绪论

思想决定行动,行动养成习惯,习惯形成品质,品质决定命运。——陶行知

本章讲的是c++的初阶模板,全文不算代码字数少的可怜,但模板是我们c++必须学的一个宝物,他的出现可是c++的飞跃性成就!下面将主要以代码的方式来进行语法学习。

话不多说安全带系好,发车啦(建议电脑观看)


附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要


思维导图:

要XMind思维导图的话可以私信哈


目录

1.泛型编程

2.函数模板

2.1实现模板的原理

2.2函数模板的实例化

3.类模板


1.泛型编程

知识点:

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

他们在一些重复性很强的代码上虽然使用函数重载可以实现,但是终究有不好的地方,重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数,代码的可维护性比较低,一个出错可能所有的重载均出错。
具体那下面的代码具体展示:
下面是swap交换函数,此时就是对不同的类型就需要不同的交换函数:

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

void swap(char& x, char& y)
{
    char tmp = x;
    x = y;
    y = tmp;
}

void swap(float& x, float& y)
{
    float tmp = x;
    x = y;
    y = tmp;
}

// ......

对此c++,为了解决这个问题就提出了一个新语法:模板(模板就像一个模具一样我们创造出来的东西形状都一样,只是我们放进去的材料不同最终出来的也东西就有所不同。在上面的交换函数中,交换的方法是一样的,只是他们的类型不同,也就是所谓的换汤不换药还是老一套,所以就能用模板来快速的实现相类函数的创建)。


2.函数模板

知识点:

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

template<typename T1, typename T2 ...> 、 template<class T, ....>  

返回值类型 函数名(参数列表)

{}

  • 其中class 和 typename是一样的效果我们都可以使用

  • 模板需要和需要模板的函数紧挨着一起出现。模板参数的使用范围就是在其下方的函数/类的域中。

 使用练习(注意看注释):

//template<class Ty>和下面的是效果一样的,并且内部的Ty是和变量名一样可以自行diy的
template<typename T>
void Swap(T& x, T& y) {
	T tmp = x;
	x = y;
	y = tmp;
}


// 我们可以定义多个模板参数,来分开识别使用,防止出现两个参数的类型不同的情况
template<class T1,typename T2>
void Func(T1& x, T2& y)//此处定义了两个模板参数,就能对应对当两个类型不同的情况
{
	cout << x << ' ' << y << endl;
}

int main()
{
	int a = 0 , b = 1;
	double c = 1.1, d = 2.2;
	Swap(a, b);
	Swap(c, d);


	int e = 10;
	double f = 10.4;
	Func(e, f);

	return 0;
}


细节:

2.1实现模板的原理

模板的实现原理其就和现实中的很像,通过一个模具,重复多次某种类似的过程而模具就像上面代码中的模板下面的函数一样,在这过程中通过这个模具会创建出多个看不见的重载的函数,其实本质还是创建了多个函数并且去调用了这些函数,只是这实现过程被编译器代替了而已(模板的实例化)。

注意:虽然他们用的是同一个模板,但是他们调用的函数时不一样的!

附:其实在c++库中已经为我们写好了这个交换函数,所以说从后面开始我们不需要在自己去实现swap函数,直接用就可以 , swap(变量,变量);


2.2函数模板的实例化

  • 用不同类型的参数使用函数模板时,称为函数模板的实例化。
  • 模板参数实例化分为:隐式实例化和显式实例化
  1. 隐式实例化:给参数去直接直接识别类型,然后给到模板参数创建函数,就如上面的练习一样。
  2. 显示实例化:自己直接给函数的模板参数在调用前确定类型

举例练习:

显示实例化的写法:

在函数和参数之间加上方括号 , 并且在内部加上类型  如 :Func<int>(a,b)。

具体如下:

template<typename T>
T* Alloc(int n)
{
	return new T[n];
}

int main()
{
	int* ptr = Alloc<int>(10);//此时的<int>就是一个显示的实例化,直接给这个函数的模板参数定义了类型int
	return 0;
}

3.类模板

知识点:

  • 类模板的定义格式:类模板和函数模板使用方法和功能都几乎一样,只是用处有些许的不同(具体将通过代码展示)
  • 对于函数模板来说他的作用域是挨着的函数局部域,而对于类模板来是作用于紧挨着的整个类域里面。

细节:

如果加上了类模板的话,就会改变其类的类型: 

类型: 类名<所有模板参数> 

类的类名还是一样  

练习使用(再次理解,注意注释)

template<typename T>
class Stack
{
public:
	Stack(int capacity = 4)
	{
		_arr = new T[capacity];
		int _size = 0;
		int _capacity = capacity;
	}

	void Push(const T& x);


	~Stack()
	{
		delete _arr;
		_size = 0;
		_capacity = 0;
	}

private:
	T* _arr;
	int _size;
	int _capacity;
};

template<typename T>
void Stack<T>::Push(const T& x)//此时我们定义全局函数时,需要我们指定类域才能使用其内部的成员
//而对于函数模板来说,此时的类型也该变成 Stack<模板参数>
{
	//CheckCapacity()
	_arr[_size] = x;
	_size++;
}

int main()
{
	Stack<int> st1;//显示实例化,此处必须加上这个显示...
	Stack<double> st2;//double

	//这样写我们就不用像cyy那样需要去改变 TypeDate 了
	//并且,可以同时使用多种类型的栈
    //C语言不能同时拥有,因为C语言的TypeDate只能在一处使用,就导致定死后不能用于
	//另外一处新的类型的对象中,而模板就能突破这个界限,创建多个类型不同功能一样的函数
	return 0;
}

本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量C++细致内容,早关注不迷路。

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

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

相关文章

如何在华为OD机试中获得满分?Java实现【打印文件】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

jsp基于 JavaWeb+springboot 的校园快递驿站管理系统

不同的系统提供的服务也不相同&#xff0c;其对应的功能也不相同&#xff0c;所以&#xff0c;系统开工前&#xff0c;需要明确其用途&#xff0c;确定其功能。由此&#xff0c;才可以进行各个任务的开展。 校园驿站管理系统经过分析&#xff0c;确定了其需要设置管理员的角色&…

如何使用Word控件Spire.Doc创建专属条码?

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

chatgpt赋能python:Python修改变量名:提高代码可读性和维护性

Python修改变量名&#xff1a;提高代码可读性和维护性 Python是一门通用编程语言&#xff0c;被广泛应用于Web开发、数据分析、人工智能等领域。在实际开发中&#xff0c;我们可能会遇到需要修改变量名的情况。本文将介绍如何使用Python修改变量名&#xff0c;提高代码的可读性…

LiveGBS流媒体平台国标GB/T28181功能-作为下级级联到海康大华宇视华为等第三方国标平台同样支持对接政务公安内网国标视频平台

LiveGBS流媒体平台国标GB/T28181功能-作为下级级联到海康大华宇视华为等第三方国标平台同样支持对接政务公安内网国标视频平台 1、什么是GB/T28181级联2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、如何提供信息给上级3.2、上级国标平台如何添加下级域3.2、接入Li…

【vim neovim】从入门到放弃(“四种”模式、常用命令、正则表达式、文件属性、插件安装--代码补全、文件树)

本文所有操作均通过ssh连接腾讯云服务器完成。如果你正在使用安装GNOME桌面的Linux&#xff0c;很多操作可以通过鼠标完成&#xff0c;或许更加直观。 推荐使用neovim&#xff08;结合鼠标操作更加丝滑&#xff09;。 nvim效果展示&#xff1a; 一、vim简介二、vim操作2.1 三种…

【SpringCloud】三、Nacos服务注册+配置管理+集群搭建

文章目录 一、认识Nacos1、安装2、服务注册和发现3、服务分级存储模型4、负载均衡策略--NacosRule5、服务实例的权重设置5、环境隔离namespace6、Eureka和Nacos的区别 二、Nacos配置管理1、统一配置管理2、微服务配置拉取3、配置热更新4、多环境配置共享 三、Nacos集群搭建1、初…

【JavaSE】Java基础语法(十一):String、StringBuilder详解

文章目录 &#x1f378;1. String类&#x1f349;&#x1f349;1.1 String概述&#x1f349;&#x1f349;1.2 String类的构造方法&#x1f349;&#x1f349;1.3 创建字符串对象的区别对比&#x1f349;&#x1f349;1.4 字符串的比较1.4.1 字符串的比较 &#x1f349;&#x…

GitHub上标星75k+超牛的《Java面试突击离线版》够你润进去了

前言 不论是校招还是社招都避免不了各种面试。笔试&#xff0c;如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的&#xff0c;我这个有章可循‘说的意思只是说应对技术面试是可以提前准备。 运筹帷幄之后&#xff0c;决胜千里之外!不打毫无准备的仗,我觉…

C# 栈(Stack)

目录 一、概述 二、基本的用法 1.入栈 2.出栈 Pop 方法 Peek 方法 3.判断元素是否存在 4.获取 Stack 的长度 5.遍历 Stack 6.清空容器 7.Stack 泛型类 三、结束 一、概述 栈表示对象的简单后进先出 (LIFO) 非泛型集合。 Stack 和 List 一样是一种储存容器&#x…

这种新的Facebook Messenger群发方式,让你的信息更有价值!

随着社交媒体的迅速发展&#xff0c;Facebook已成为人们分享信息、建立联系和开展业务的重要平台之一。在这个数字时代&#xff0c;如何有效地传达信息并与目标受众建立联系成为了关键的挑战。 而最近引入的Facebook Messenger群发方式为我们提供了一种全新的机会&#xff0c;…

【CloudCompare教程】008:基于点云的三维模型重建(泊松重建)

本文讲述基于点云的三维模型重建方法,PoissonRecon是“Poisson Surface Reconstruction”的缩写,它是由约翰霍普金斯大学的Misha Kazhdan47提出的三角形网格生成算法的简单接口。 文章目录 一、加载点云二、计算法向量三、泊松建模四、利用输出密度一、加载点云 加载兔子点云…

接口测试神器:ApiKit

想给大家分享一款技术人必备的接口测试神器&#xff1a;ApiKit&#xff0c;应该是我目前用过&#xff0c;算得上良心的接口工具 背景 作为互联网行业技术从业者&#xff0c;接口调试是必不可少的一项技能&#xff0c;通常我们都会选择使用 Postman 这类工具来进行接口调试&…

Kali-linux使用Aircrack-ng工具破解无线网络

Aircrack-ng是一款基于破解无线802.11协议的WEP及WPA-PSK加密的工具。该工具主要用了两种攻击方式进行WEP破解。一种是FMS攻击&#xff0c;该攻击方式是以发现该WEP漏洞的研究人员名字&#xff08;Scott Fluhrer、Itsik Mantin及Adi Shamir&#xff09;所命名&#xff1b;另一种…

播放量上百亿,易车新媒体矩阵到底做对了什么

消费者的媒介触点和整体决策链路在不断向线上偏移&#xff0c;有数据显示&#xff0c;超7成的车主对信息的获取渠道偏好为汽车垂直媒体。 在这个大背景下&#xff0c;谁能打造更专业的内容&#xff0c;能更快速且广泛地触达用户&#xff0c;谁才更有可能脱颖而出&#xff0c;汽…

如何快速搭建SpringBoot+Vue前后端分离的开发环境

唠嗑部分 今天我们来说一说&#xff0c;如何快速搭建SpringBootVue前后端分离的开发环境 需要前置环境nodejs&#xff0c;请自行安装(傻瓜式安装) SpringBoot采用2.4.2版本&#xff0c;Vue采用Vue2版本 言归正传 创建Vue项目 1、安装vue npm install -g vue/cli2、检查v…

【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第一章——调试调优背景介绍

1.模型迁移、模型调试调优背景介绍 模型训练\推理过程中可能遇到的问题&#xff1a; • 代码编写错误&#xff0c;问题难以定位&#xff1b; • 模型结构错误&#xff1b; • 权重更新错误&#xff1b; • 损失函数设计错误&#xff1b; • 半精度下计算溢出&#xff1b; • L…

上线11年公众号广告大变天!最新政策解读|西瓜数据

昨晚&#xff0c;微信公众平台的一则公告&#xff0c;在圈内炸开锅了。 ▲ 图片来源&#xff1a;西瓜数据社群截图 公告称&#xff1a; 公众号运营者与第三方商业合作形式推销商品或者服务&#xff0c;如附加购物链接等购买方式的商业合作营销内容&#xff0c;在2023年6月30日…

迅为RK3568开发板Android 双屏/三屏同显

iTOP-RK3568 开发板支持以下屏幕 迅为 LVDS 7 寸屏幕 迅为 LVDS 10.1 寸 1024*600 屏幕 迅为 LVDS 10.1 寸 1280*800 屏幕 迅为 MIPI 7 寸屏幕 HDMI 屏幕&#xff08;通过 HDMI 线连接&#xff09; HDMI 屏幕&#xff08;通过 VGA 线连接&#xff09; 然后修改 Android1…

Linux系统提权

滥用的SUDO提权 执行流程&#xff1a;当前用户转换到root&#xff0c;然后以root身份执行命令&#xff0c;执行完成后&#xff0c;直接退回到当前用户 注意&#xff1a;执行sudo时输入的命令&#xff0c;是当前用户的密码&#xff0c;而非root密码 sudo配置文件&#xff1a;…