模板
特点
不能直接使用,只是个框架
模板的通用并不是万能
模板机制
函数模板
建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表,在使用的时候再确定
语法
解释
交换函数中只是函数名和形参不一样
应用
1、在模板前加一行代码,在调用的时候可以选择自动类型推导,或者显式指定类型
注意事项
自动推导,必须推导出一致的数据类型T才可以使用
模板必须要确定出T的数据类型
在调用的时候必须要加一个int类型,要不然就会报错
普通函数与函数模板的区别
1、普
2、函数模板用自动类型推到,不可以发生隐式类型转换
3、函数模板用显示指定类型,可以发生隐式类型转换
普通函数:
char 被转换成了int
函数模板:
这种会报错,因为编译器不清楚应该转换成char 还是int
显示指定类型
如果传进来是char 那么久自动转换成int
普通函数与函数模板的调用规则
1、同时存在函数模板和普通函数的时候,优先调用普通函数
2、可以通过空模板参数列表来强制调用函数模板
3、函数模板也可以发生重载‘
4、如果函数模板可以产生更好的匹配,优先调用函数模板
模板局限性
如果传入的a和b是一个数组那么就无法实现了
如果传入的是自定义类型,也无法运行
类模板语法
类模板作用
建立一个通用类,类中的成员,数据类型可以不具体制定,用一个虚拟的类型代表
语法
类模板与函数模板的区别
1、类模板没有自动 类型推导的使用方式
2、类模板在模板参数列表中可以有默认参数
此处模板参数列表默认是整型
调用的时候,可以不用声明agetype的类型,也不会报错
类模板中成员的创建时机
1、类模板中成员函数在调用时候才创建
因为一开始无法确定数据类型,不知道调用哪个,只有在调用的时候才去创建
定义两个类
类模板
类模板对象做函数参数
类模板实例化出对象,向函数传参的方式
三种方式
1、指定传入类型,–直接显示对象的数据类型
2、参数模板化,将对象中的参数变为模板进行传递
3、整个类模板化,将这个对象类型模板化进行传递
类模板与继承
类模板碰到继承时
1、当子类继承的是一个类模板时,子类在声明的时候,要制定出父类中的类型
2、如果不指定,编译器无法给子类分配内存
3、如果想灵活制定出父类中T的类型,子类也需变为类模板
父类
子类继承的规则
也可以再让子类多命名几个类模板,给父类用,T1给自己,T2给父类
类模板成员函数类外实现
把类内的函数声明拖到类外,再加作用域,同时在前面加类模板声明
类内声明
类外实现
类模板的分文见编写
问题
类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到
解决
直接包含.cpp文件
将声明和实现写在同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制
类模板与友元
全局函数类内实现,直接在类内声明友元即可
全局函数类外实现,需要提前让编译器知道全局函数存在
类外实现比较麻烦
先让编译器知道哪些用了类模板
}
建议全局函数做雷内实现,简单而且编译器可以识别