C++模板详解

C++模板详解_第1张图片

文章目录

    • 1、泛型编程
    • 2、函数模板
    • 3、函数模板实例化
    • 4、函数模板实例化
    • 5、类模板及其实例化

1、泛型编程

  泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
优点:
1、高度可重用性:泛型编程使用模板参数来指定数据类型,从而可以为多种不同的数据类型提供通用的算法和数据结构。这使得代码具有很高的可重用性,能够大大简化开发过程。
2、更好的效率:由于泛型代码是在编译时期生成的,并且对各种数据类型都进行了静态类型检查,因此其执行速度比动态类型语言更快。
3、减少代码冗余:使用泛型编程技术,我们可以将重复的代码放置到函数或类模板中,从而避免手动创建相似但又不能互用的代码块

使用函数重载虽然可以实现,但是有一下几个缺点:

1、 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数
2.、代码的可维护性比较低,一个出错可能所有的重载均出错。那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?

  如果在C++中,也能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(即生成具体类型的代码)对此,我们引出模板的概念
C++模板详解_第2张图片

2、函数模板

概念:
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
函数模板格式:
template
返回值类型 函数名(参数列表){}

C++模板详解_第3张图片
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

  那么模板调用的是用一个函数吗?我们转到反汇编,进去一探究竟,发现交换调用了两个函数,且地址不一样,模板实例化类型也不一样,明显调用的不是同一个函数,交换< int >类型会把模板实例化为< int >,交换 < double >类型会把模板实例化为 < double >。函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器

C++模板详解_第4张图片

3、函数模板实例化

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

1、 隐式实例化:让编译器根据实参推演模板参数的实际类型
2、 显式实例化:在函数名后的<>中指定模板参数的实际类型

  虽然编译器会隐式实例化但有些时候还是需要我们显示实例化来解决一些歧义问题,比如我们用以下函数交换< int > < double >两种类型。如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错

C++模板详解_第5张图片

4、函数模板实例化

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

C++模板详解_第6张图片

5、类模板及其实例化

类模板的定义格式

C++模板详解_第7张图片

注意:类模板中函数放在类外进行定义时,需要加模板参数列表,因此初学的时候我们尽量不要声明和定义分离

C++模板详解_第8张图片

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

总结:
  C++模板知识点不多,到这里就结束了,期待我们下一篇博客见面!!!

你可能感兴趣的:(C++,c++,java,开发语言)