[C++基础]-初识模板
创始人
2024-03-31 22:41:33

前言

作者:小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。

目录

一、泛型编程

二、函数模板

1、函数模的概念

2、函数模板的示例化 

3、模板参数的匹配原则

3、类模板 

1、类模板的定义

2、类模板的实例化 


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

一、泛型编程

什么是泛型编程呢?

百度是怎么说的:

 也就是说对于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是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

2、函数模板的示例化 

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

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

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

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

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

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

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

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

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

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

templateT Add(const T& left, const T& right)
{return left + right;
}int main()
{int a = 10;double b = 20.2;cout << Add(a, b) << endl;return 0;
}

这里我们在函数名后的<>中指定模板参数的实际类型,这样函数就不会因为参数类型指定不明确而报错了。

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

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

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

3、模板参数的匹配原则

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

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

3、类模板 

1、类模板的定义

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

emplate
class 类模板名
{
 // 类内成员定义
};

2、类模板的实例化 

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

/ Date类名,Date才是类型
Date s1;
Date s2;

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

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

这样的数组有什么用呢?

其实对于这个数组来说,如果一但越界就会检测出来(assert的断言了),而在C语言中的数组是抽查是否存在越界的情况。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...