泛型编程:类模板(完)

类模板基础

  1. 语法: template <typename Type>
  2. 每个模板类成员函数的前面都要加上template <classType>template <typename Type>,但如果在类声明中定义了方法(内联定义),则可以省略模板前缀和类限定符
  3. 模板不是类和成员函数,而是C++编译器指令,说明了如何生成类和成员函数定义
  4. 实例化(具体化): 模板的具体实现,eg: 处理string对象的栈类
  5. 不能讲模板成员函数放在独立的实现文件中,由于模板不是函数,它们不能单独编译
  6. 模板必须与特定的模板实例化请求一起使用,应将模板类的声明以及模板成员函数都放在一个.h的头文件中,并在要使用这些模板的文件中包含该头文件
template <class Type>  //或者 template <typename Type>
class Stack
{
private:
		Type items[MAX];
public:
		Stack();
		bool push(const Type & item);
};

template <class Type>
Stack<Type>::Stack()
{
		top = 0;
}
  • 模板类的使用:
  1. 使用所需的具体类型替换泛型名: eg: Stack<string> colonels;
  2. 与常规的函数模板不同,类模板必须显式提供所需的类型
  • 表达式参数:
  1. template <class T, int n>,其中参数int n,指定特殊的类型而不是用作泛型名,称为非类型参数表达式参数
  2. 表达式参数可以是整型枚举引用指针
  3. 模板参数不能修改参数的值,也不能使用参数的地址,n++&n都是错误的
  4. 实例化模板时,用作表达式参数的值必须是常量表达式
  5. 表达式参数的值不同将生成不同的独立的类声明

在这里插入图片描述

  • 模板的多功能性:
  1. 可以将常规的类技术用于模板类
  2. 模板类可以用作基类,也可以用作组件类,还可以用作其他模板的类型参数
  3. 模板类可以递归使用
  4. 模板类可以使用多个类型参数,并且可以为类型参数提默认值
    (1)可以为类模板类型参数提供默认值,但不能为函数模板提供默认值
    (2)类模板函数模板都可以为非参数类型提供默认值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类模板的具体化

  1. 具体化: 使用具体的类型生成类声明
  2. 分类: 隐式实例化显式实例化显式具体化部分具体化
  • 隐式实例化:
  1. 实例化: 编译器使用通用模板提供的处方生成具体的类定义
  2. 隐式实例化: 声明一个或多个对象,指出所需的类型来进行实例化
  3. 使用隐式实例化时,编译器在需要对象之前,不会生成类的隐式实例化

在这里插入图片描述

  • 显式实例化:
  1. 显式实例化:使用关键字template指出所需类型来声明类时,编译器将生成类声明的显式实例化
    (1)声明必须位于模板定义所在的名称空间
    (2)显式具体化时,虽然没有创建类对象,编译器也将生成类声明(包括方法定义)

在这里插入图片描述

  • 显式具体化:
  1. 显式具体化:用特定类型(用于替换模板中的泛型)的定义
    (1)当具体化模板和通用模板都与实例化请求匹配时,编译器将使用具体化版本
    (2)具体化类模板定义的格式:
    template <> class Classname<specialized-type-name> {...};

在这里插入图片描述

  • 部分具体化:
  1. 部分具体化: 部分限制模板的通用性
  2. 如果指定所有的类型,则<>内将为空,将导致显式具体化
  3. 如果有多个模板可供选择,编译器将使用具体化程度最高的模板
  4. 也可以通过为指针提供特殊版本来具体化现有的模板
  5. 部分具体化特性能够设置各种限制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

成员模板

  1. 模板可以用作结构、或模板类的成员
  2. 模板函数或模板类做成员时,可以在类内声明类外定义

在这里插入图片描述
在这里插入图片描述

类模板作参数

  1. 类模板还可以包含本身就是模板参数

在这里插入图片描述

模板类与友元

  1. 模板的友元分3类:非模板友元约束模板友元非约束模板友元

非模板友元

  1. 非模板友元:非模板友元函数本身不是模板函数
  2. 必须为要使用的友元定义显式具体化

在这里插入图片描述

模板类的约束模板友元函数

  1. 模板类的约束模板友元函数: 友元函数本身成为模板
    (1)在类定义的前面声明每个模板函数
    (2)在函数中再次将模板声明为友元
    (3)为友元提供模板定义

在这里插入图片描述

模板类的非约束模板友元函数

  1. 模板类的非约束模板友元函数:
    (1)通过在类内部声明模板,可以创建非约束友元函数,即每个函数具体化都是每个类具体化的友元
    (2)对于非约束友元,友元模板类型参数与模板类类型参数是不同的

在这里插入图片描述

模板别名

  1. 可以使用typedef为模板具体化指定别名
  2. 可使用using =为模板提供别名
  3. C++11允许语法using=用于非模板,此时与typedef等价

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_46427273

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值