【C++】模板初阶

文章目录

  • 一. 泛型编程
  • 二. 函数模板
    • 1. 概念
    • 2. 格式
    • 3. 函数模板的原理
    • 4. 函数模板参数的实例化
    • 5. 函数模板参数的匹配原则
  • 三. 类模板
    • 1. 类模板的定义格式
    • 2. 类模板的实例化
    • 3. 类模板函数成员在类外定义

一. 泛型编程

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

【C++】模板初阶_第1张图片


二. 函数模板

1. 概念

函数模板代表了一个函数家族,函数模板与类型无关,在使用时被实例化,根据实参类型匹配出特定的模板函数。

2. 格式

template<typename T1, typename T2,......,typename Tn> 
返回值类型 函数名(参数列表)
{
	//函数内容...
}

typename是用来定义模板参数的关键字,也可以使用class(注意这里和声明类不一样,声明类用class,声明结构体用struct,struct和class不能相互替换)。
【C++】模板初阶_第2张图片

3. 函数模板的原理

  • 模板不会被编译代码指令放到代码段。
  • 在预处理阶段,编译器根据模板内容和传入实参的类型,生成对应的函数,最后编译代码指令把这些实例化出来的函数送到进程的代码段去执行。
    【C++】模板初阶_第3张图片

4. 函数模板参数的实例化

模板参数实例化分为:隐式实例化和显式实例化。

  • 隐式实例化:让编译器根据传入的实参推演模板参数的实际类型。
  • 显式实例化:在函数名后的的<>中指定模板参数的实际类型
    【C++】模板初阶_第4张图片

5. 函数模板参数的匹配原则

  • 如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。
    【C++】模板初阶_第5张图片
  • 一个非模板函数可以和一个同名的函数模板同时存在,而且函数模板还可以被实例化为这个非模板函数。
    【C++】模板初阶_第6张图片
  • 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从对模板实例化。
    【C++】模板初阶_第7张图片

三. 类模板

1. 类模板的定义格式

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

2. 类模板的实例化

类模板必须显示实例化。即在定义一个对象时要在类名后面加上 <实例化的类型>
【C++】模板初阶_第8张图片

3. 类模板函数成员在类外定义

  • 类模板的每个成员在外面定义时一开始都要声明模板的参数。
  • 类名后还要加上模板的参数列表。
    【C++】模板初阶_第9张图片

你可能感兴趣的:(C++,c++,模板)