第十六章_模版

目录

一、模版的概述 

二、函数模板

1.定义方式

2.函数模板注意点

3.函数模板的重载

 4.函数模版的局限性

三、类模板

1.定义方式

 2.类模板的成员函数在类外实现

3.函数模板作为类模板的友元

4.普通函数作为类模板的友元

 5.模板 头文件和源文件 分离问题

 6.类模板的继承


一、模版的概述 

c++ 面向对象编程 思想:封装、继承、多态

c++ 泛型编程 思想:模板

模板的分类:函数模板、类模板

函数模板(类模板):将功能相同,类型不同的函数(类)的类型抽象成虚拟的类型。当调用函数(类实例化对象)的时候,编译器自动将虚拟的类型 具体化。(实际上是建立了一个通用函数)

模版 完整的类型名 是 函数名/类名<类型>

二、函数模板

1.定义方式

关键字 template

模板会编译两次:

        第一次:是对 函数/类模板 本身编译

        第二次:函数调用处/类实例化处 将T的类型具体化

函数模板目标:模板是为了实现泛型,可以减轻编程的工作量,增强函数的重用性。 

 

2.函数模板注意点

2.1 函数模板 和 普通函数 都识别(优先选择 普通函数) 

 2.2 函数模板 和 普通函数 都识别(强制使用函数模版) 

 

<int>:告诉编译器是int类型,不用推导了

2.3 函数模版 自动类型推导时,不能对 函数参数 进行 自动类型转换。

调用 函数模板 时,如果 传入各参数类型 不相同,调用失败。

调用 普通函数 时,如果 实参类型 可以强制转换成 形参类型 ,仍然可以调用。

3.函数模板的重载

 

 4.函数模版的局限性

 当函数模板 推导出 T为数组或其他自定义类型数据,可能导致运算符不识别。 

解决方法一:运算符重载(推荐)

解决方法二:具体化 函数模版

三、类模板

1.定义方式

模板 完整的类型名 是 Data<T1,T2>

或( template只能作用于class Data这个区域 )

 

类模板 实例化对象 不能自动类型推导,必须指明T类型。 

【像Data(){},无参,无法知a、b是什么类型,无法开辟空间,所以 类模板不能自动类型推导】

 2.类模板的成员函数在类外实现

(1)+template声明

(2)函数名前+作用域(作用域带 <类型> )

3.函数模板作为类模板的友元

 ​​​​​

4.普通函数作为类模板的友元

 

 5.模板 头文件和源文件 分离问题

模板最好用 data.hpp 代替 data.h和data.cpp

【即把.cpp中的内容直接写在.h中,不需要再写.cpp了。

如果模板写在.cpp文件里,因为模板要编译两次,第一次编译在预处理阶段会编译.h头文件,第二次编译不会再编译.h头文件,这样的话就没有 具体化类型。

所以干脆不写.cpp文件,直接把.cpp文件的内容写在.h中,项目名称改成.hpp 】

 6.类模板的继承

6.1 类模板派生出普通类

 

6.2 类模板派生出类模板

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值