[C++基础]-初识模板

这篇具有很好参考价值的文章主要介绍了[C++基础]-初识模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

a.编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 b.函数,C++,c++,算法,数据结构作者:小蜗牛向前冲

a.编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 b.函数,C++,c++,算法,数据结构名言:我可以接受失败,但我不能接受放弃

 如果觉的博主的文章还不错的话,还请a.编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 b.函数,C++,c++,算法,数据结构点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。

目录

一、泛型编程

二、函数模板

1、函数模的概念

2、函数模板的示例化 

3、模板参数的匹配原则

3、类模板 

1、类模板的定义

2、类模板的实例化 


 本期学习目标,了解什么是泛型编程,学会使用函数模板和类模板。

一、泛型编程

什么是泛型编程呢?

百度是怎么说的:

a.编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 b.函数,C++,c++,算法,数据结构

 也就是说对于C++来说,泛型编程的出现是为了切合C++中的模板,那什么是模板呢?这个先不急这了解,下面我们先看一段代码:
 

//整形交换
void Swap(int& left, int& right)
{
	int tmp = left;
	left = right;
	right = tmp;
}

//浮点型交换
void Swap(double& left, double& right)
{
	int tmp = left;
	left = right;
	right = tmp;
}

//字符型交换
void Swap(char& left, char& right)
{
	int tmp = left;
	left = right;
	right = tmp;
}

这里我们写了一个交换函数,虽然交换函数里面的内容都是相同的,但是由于我们传的参数类型的不同,这就导致我们要写三个不同参数类型的函数(C++被函数重载所支持)。

这里我们使用函数重载虽然能够实现,但是有几个不好的地方:

1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数

2. 代码的可维护性比较低,一个出错可能所有的重载均出错

于是C++就提出了一个叫模板的东西,我们很以理解为我们要去拓印不同颜色的图画, 图画的内容是相同的,就是颜色不同,这时我们往往只要一个拓印的模板,想要拓印出不同颜色的图画,就用不同颜色的墨汁就可以了。

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

二、函数模板

1、函数模的概念

既然C++提出了一个叫模板的概念,那么函数模板就可以认为是一个函数家族,该模板中的内容于类型无关,根据实参产生相应的特定类型。

函数模板的时候语法:

template<typename T1, typename T2,......,typename Tn>

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

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

2、函数模板的示例化 

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

隐式实例化:让编译器根据实参推演模板参数的实际类型

下面我们用函数模板去实现交换函数:

template<typename T>
void Swap(T& left, T& right)
{
	T tmp = left;
	left = right;
	right = tmp;
}

a.编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 b.函数,C++,c++,算法,数据结构

 这里我们用写了一个函数模板,就实现了整形和浮点型的交换,但是我们在思考一个问题,模板能够让一个整形和浮点型进行交换吗?

这里我们让a和c进行交换:

a.编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 b.函数,C++,c++,算法,数据结构

 这里我们发现函数报错了,说函数的参数指向不明确,因为参数T不可能一会是整形,一会是浮点型,那么我们还有什么方法解决这个问题吗?

其实我们也可以在对于模板的时候使用都参数,定义出T1和T2,这样就能让T1指向整形,T2指向浮点型了。

a.编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 b.函数,C++,c++,算法,数据结构

显式实例化 :在函数名后的<>中指定模板参数的实际类型

下面我们继续写一个加法函数模板:

template<typename T>

T Add(const T& left, const T& right)
{
	return left + right;
}

int main()
{
	int a = 10;
	double b = 20.2;
	cout << Add<int>(a, b) << endl;
	return 0;
}

这里我们在函数名后的<>中指定模板参数的实际类型,这样函数就不会因为参数类型指定不明确而报错了。a.编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 b.函数,C++,c++,算法,数据结构

 这里为什么会可以呢,其实是如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

a.编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 b.函数,C++,c++,算法,数据结构

 这里为什么会报错了,不就是因为隐式类型无法转换。那我们为什么Add函数就可以转换成功而Swap函数就会报错。

其实是Add的形参用const的修饰了,形参是实参的一份临时拷贝,在拷贝实参的过程中会生成一个临时变量(临时变量具有常性),这里用const修饰就不会出现引用权限发大的现象(常变量赋值给常变量)。而Swap没有用const修饰(因为要进行二者的交换),这就会导致(将一个非常变量赋值给一个常变量导致引用权限的放大)。

3、模板参数的匹配原则

  • 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
  • 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模 板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
  • 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

这里我们简单理解一下为什么说模板函数不允许自动类型的转换,如果要转化也是通过编译器强制进行的,如果转换不成功也会报错。 

3、类模板 

1、类模板的定义

对于类模板的其实也是和函数模板的定义也是差不多的,也是用关键字emplate来定义的。

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

2、类模板的实例化 

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

/ Date类名,Date<int>才是类型
Date<int> s1;
Date<double> s2;

下面我们用类模板实现一个数组:

#define N 10
template<class T>
class arr
{
public:
	//重载[]
	T& operator[](size_t i)
	{
		assert(i < N);
		return _a[i];
	}
private:
	T _a[N];
};

这样的数组有什么用呢?

其实对于这个数组来说,如果一但越界就会检测出来(assert的断言了),而在C语言中的数组是抽查是否存在越界的情况。文章来源地址https://www.toymoban.com/news/detail-810297.html

到了这里,关于[C++基础]-初识模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • python 基础篇 day 1 初识变量和数据类型

    变量作用——用于存储和表示数据。 通过定义和使用变量,我们可以在程序执行过程中动态地保存和修改数据。 变量的作用包括但不限于以下几个方面: 存储数据 :变量可以用来 存储各种类型的数据 ,包括数字、字符串、布尔值等。 数据传递 :变量可以 作为参数传递

    2024年02月09日
    浏览(43)
  • rust 初识基础: 变量、数据类型、函数、所有权、枚举

    了解到 rust 和 WebAssembly 的结合使用,可以构建前端应用,而且性能也比较好。初步学习使用 rust 是预编译静态类型语言。 官网下载 rust-CN , 大致了解下为什么选择:高性能、可靠性、生产力。 打开控制台啊,执行安装 (mac 系统,windwos 或其他系统查看官网) 安装成功时,会打

    2024年02月07日
    浏览(57)
  • 11.5序列检测、含无关项~,不重叠~,报错,always模板与经验复盘

    a是一位的信号,检测连续的一串信号 遍历法 从第一位往后不断和目标串比较 不用管是不是阻塞非阻塞的含义了,难以理解,用了一定不会出问题,不用可能出问题,分析不出来 还是和之前一样,保留一串,不过检测的时候分为两部分,两部分检测都通过了就表示匹配成功

    2024年02月05日
    浏览(38)
  • 初识Java篇(JavaSE基础语法)(1)(数据类型+运算符)

     个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客 目录 前言:  初识Java  运行Java程序 注释 标识符 数据类型与变量  字面常量 数据类型 变量 类型转换  类型提升  字符串类型  运算符 算术运算符  关系运算符  逻辑运

    2024年03月24日
    浏览(51)
  • C# 泛型类型详解:编写更安全、可重用的代码

    在C#中,泛型类型是一种强大的特性,它允许我们编写更加灵活和可重用的代码。本文将详细介绍泛型类型的概念、优势以及使用方法,并提供一些示例来帮助新手更好地理解 泛型类型是一种在编译时能够指定类型参数的类型。它允许我们在定义类、接口、方法等时,不指定

    2024年02月20日
    浏览(48)
  • 【基于若依开发的后台管理系统通用模板-低代码权限管理框架系统-代码一键生成-可视化拖拽-PC端与手机全端支持】

    LessCode是基于若依系统开发的一款后台管理系统通用模板,低代码权限管理框架系统,可多终端适配,同时支持PC端、APP、小程序、H5;LessCode内置代码生成功能,可一键生成java后端、vue前端、uniapp手机端代码,极大提高了程序员的开发效率;其内置框架功能包含用户角色权限

    2024年04月24日
    浏览(51)
  • 地址无关代码

    水不脏人,人却脏水。这就是上善若水? 我们时常说地址无关和地址相关代码是什么? 假设我们有一段代码,这段代码可以随意粘贴到任何程序中运行那么我可以简单的理解为这就是位置无关代码。 我们看下如下的代码: 这段代码对应的汇编代码如下: 下划线就是被重定

    2024年02月05日
    浏览(27)
  • 【JaveWeb教程】(17) MySQL数据库开发之 MySQL简介、安装、数据类型、SQL通用语法 详细代码示例讲解

    在我们讲解SpringBootWeb基础知识(请求响应案例)的时候,我们讲到在web开发中,为了应用程序职责单一,方便维护,我们一般将web应用程序分为三层,即:Controller、Service、Dao 。 之前我们的案例中,是这样子的请求流程:浏览器发起请求,先请求Controller;Controller接收到请求之

    2024年01月25日
    浏览(68)
  • 【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val

      📜 本章目录: 0x00 操作符(operators) 0x01 内建类型(Build-in) 0x02 类型转换:显式类型转换 0x03 在较长数字中使用下划线 0x04 字符串(String) 0x05 字符串模板(String Templates) 0x06 字符串连接(变量插值) 0x06 指定变量类型 0x07 可变 var 和不可变 val 0x00 操作符(operators)

    2024年02月11日
    浏览(47)
  • 条款44:将与参数无关的代码抽离templates

    Template是个节省时间和避免代码重复的一个方法。不再需要键入20个类似的classes而每一个带有15个成员函数,只需要键入一个class template,留给编译器去具现化那20个你需要的相关classes和300个函数。( class template的成员函数只有在被使用时才被暗中具现化,只有在这300个函数的每

    2024年01月18日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包