C++从零开始的打怪升级之路(day12)

这篇具有很好参考价值的文章主要介绍了C++从零开始的打怪升级之路(day12)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

今天学习了关于模板的知识,下面展开分析

1.泛型编程

首先我们思考一个问题,如何是实现一个通用的交互函数呢

在C语言中,我们可能要定义实现几个不同名称的swap函数,像这样

void swap_int(int x1, int x2)
{...}
void swap_double(double x1, double x2)
{...}
void swap_char(char x1, char x2)
{...}

在C++中我们利用函数重载,可以方便一点,像这样

void swap(int x1, int x2)
{...}
void swap(double x1, double x2)
{...}
void swap(char x1, char x2)
{...}

但是重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型的出现,又得增加函数,很麻烦

于是,引出我们今天的主题:模板

模板就像告诉编译器一个模子,让编译器根据类型的不同自己生成函数

随着模板的引出,我们又不得不引出这样的名词:

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

2.函数模板

2.1函数模板概念

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

2.2函数模板格式

template<typename T1,typename T2...>

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

(typename是用来定于模板参数的关键字,也可以用class替代,不能用struct

下面写一个交换函数模板

template<class T>
void Swap(T& x1, T& x2)
{
	T x = x1;
	x1 = x2;
	x2 = x;
}

2.3函数模板的原理

函数模板是一个蓝图,它本身不是函数,是编译器用使用方式产生特定具体类型函数的模具,所以模板就是将本应该我们做的重复的事情交给了编译器

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用,比如当double类型使用函数模板的时候,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于其他类型也是这样

2.4函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化,函数模板的实例化分为隐式实例化和显式实例化

1.隐式实例化

template<class T>
void Swap(T& x1, T& x2)
{
	T x = x1;
	x1 = x2;
	x2 = x;
}

int main()
{
	int a = 0;
	int b = 1;

	Swap(a, b);
	return 0;
}

这样就是隐式实例化,编译器会自动识别类型生成函数并调用,当然如果b是double类型,我们可以在前面加上(int)强转

2.显式实例化

template<class T>
void Swap(T& x1, T& x2)
{
	T x = x1;
	x1 = x2;
	x2 = x;
}

int main()
{
	int a = 0;
	int b = 1;

	Swap<int>(a, b);
	return 0;
}

像这样,在函数名后面的<>中指定模板参数的实际类型叫做显式实例化

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器就会报错

2.5模板参数匹配原则

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

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

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

template<class T>
T Add(T x, T y)
{
	return x + y;
}

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	Add(0, 1);  // call   int Add(int x, int y)
	Add<int>(0, 1);  // call   T Add(T x, T y)
	return 0;
}

3.类模板

3.1类模板的定义格式

template<class T1,class T2...>
class  类模板名
{
    //类内成员定义
};

下面定义一个顺序表作为演示

template<class T>
class Vector
{
public:
	Vector()
		:_a(nullptr)
		,_size(0)
		,_capacity(0)
	{}

	~Vector();

private:
	T* _a;
	size_t _size;
	size_t _capacity;
};

template<class T>  //注意在类外面类函数时,需要加上模板参数列表
Vector<T>::~Vector()
{
	if (_a)
		free(_a);

	_size = _capacity = 0;
}

要注意的是,这里的Vector不是具体的类,而是模具

3.2类模板的实例化

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

Vector<int> v1;
Vector<double> v2;
//Vector类名  Vector<int>才是类型

总结:模板帮我们解决了一些不必要的重复代码,使后面的使用更加便捷,明天开始学SLT,模板也是对SLT的一个铺垫

今天的博客就到这里了,后续内容明天分享,最近因为考试周原因不能更新太多内容,等考试周结束了再"快马加鞭"

新手第一次写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!!文章来源地址https://www.toymoban.com/news/detail-813296.html

到了这里,关于C++从零开始的打怪升级之路(day12)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 开发--利用android studio 制作简单文字打怪升级游戏(伪地牢类)1.开始

    本人目前是大三考研党,之前有学过一些杂七杂八的知识,但是没有办法利用这些知识制作一些真正有用的东西出来。后来自学了android开发,学会使用了android studio,终于决定利用android studio 开发一个游戏出来,也算是我一直以来的梦想吧。但是由于制作水平有限,很多部分只

    2024年02月02日
    浏览(49)
  • [Linux打怪升级之路]-管道

    前言 作者 : 小蜗牛向前冲 名言 : 我可以接受失败,但我不能接受放弃   如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习目标:理解什么是管道,学会使用匿名管道和命名管道进行通信 在学

    2024年02月08日
    浏览(45)
  • [Linux打怪升级之路]-文件操作

    前言 作者: 小蜗牛向前冲 名言: 我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、认识操纵系统下的文件 1、什么是文件 2、文件的类型 3、文件的共识

    2024年02月01日
    浏览(44)
  • [Linux打怪升级之路]-缓冲区

    前言 作者 : 小蜗牛向前冲 名言 : 我可以接受失败,但我不能接受放弃    如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正  本期学习目标:认识什么是缓冲区,缓冲区在哪里,模拟实现一个简单的缓

    2024年02月07日
    浏览(50)
  • [Linux打怪升级之路]-system V共享内存

    前言 作者 : 小蜗牛向前冲 名言 : 我可以接受失败,但我不能接受放弃   如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习目标:认识什么是 system V共享内存,认识共享内存的接口函数,学会

    2024年02月08日
    浏览(46)
  • [Linux打怪升级之路]-信号的保存和递达

    前言 作者 : 小蜗牛向前冲 名言 : 我可以接受失败,但我不能接受放弃    如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、信号的保存  1、信号其他相关常见概念 2、信号在内核中的表示 3、

    2024年02月05日
    浏览(40)
  • 【从零开始的rust web开发之路 一】axum学习使用

    第一章 axum学习使用 本职java开发,兼架构设计。空闲时间学习了rust,目前还不熟练掌握。想着用urst开发个web服务,正好熟悉一下rust语言开发。 目前rust 语言web开发相关的框架已经有很多,但还是和java,go语言比不了。 这个系列想完整走一遍web开发,后续有时间就出orm,还

    2024年02月12日
    浏览(54)
  • Jeecg-Boot 低代码开发平台之路(一) —— 开始从零学起

    今天开始详细学习下 Jeecg-Boot 低代码开发平台,官方网站对该平台的介绍是如下。 JeecgBoot是一款基于BPM的低代码平台!前后端分离架构 SpringBoot 2.x,SpringCloud,Ant DesignVue,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发! Jee

    2023年04月08日
    浏览(89)
  • 【从零开始的rust web开发之路 二】axum中间件和共享状态使用

    第一章 axum学习使用 第二章 axum中间件使用 上篇文件讲了路由和参数相应相关的。axum还有个关键的地方是中间件的使用,这篇文件就来说说。 这个概念跟gin框架的中间件概念一样,类似于springboot项目当中的请求过滤器,在请求过来的时候链式执行一些操作。例如鉴权,日志

    2024年02月11日
    浏览(50)
  • 【C++打怪之路Lv1】-- C++开篇(入门)

    🌈 个人主页: 白子寰 🔥 分类专栏: C++打怪之路,python从入门到精通,魔法指针,进阶C++,C语言,C语言题集,C语言实现游戏 👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~) 目

    2024年04月23日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包