目录
一:泛型编程
1.1:泛型编程的引出
1.2:函数模板的简单使用
二:模板技术的基本格式
(1)类模板
编辑
(2)函数模板
三:函数模板的使用
3.1:自动推导类型
3.2:显示指定类型
3.3:模板函数局限
四:类模板的使用
一:泛型编程
1.1:泛型编程的引出
我们直接通过两段代码来看一下,为什么会出现泛型编程:
对于这两个函数来说,他们函数体实现的功能是完全相同的(交换两个参数的值),唯一的区别就在于他们的参数类型不同。相同功能的代码因为参数类型的不同而被重复开发,这样就造成代码的冗余。
所以为了应对这样的情况,就出现了一种模板技术。
1.2:函数模板的简单使用
如果我们使用函数模板去实现这个功能,就不会出现因为参数类型原因,同类型代码重复开发的情况。
可以看到。我们使用同一个函数模板去操作交换两种不同类型的数据时,是完全可以实现的,这样就很好的避免的相同功能代码被重复开的的情况。
二:模板技术的基本格式
模板编程分为两类:
(1)类模板
紧跟在template<class T>下面的是类,那么就被称为类模板
(2)函数模板
紧跟在template<typename T>下面的是函数,那么就被称为函数模板 。
这里注意:typename与class的作用是完全相同的。当然一个模板其实不只能有一个泛型,如果需要,还可以在<>中用逗号拼接符继续拼接。
三:函数模板的使用
3.1:自动推导类型
在使用函数模板时,像调用普通函数那样直接调用,不显示指定类型,编译器会自动根据参数的类型进行推导,从而确定泛型的类型。
3.2:显示指定类型
在使用函数模板时,我们也可以指定泛型的类型,然后再传入参数,当然参数的类型需要和指定的类型一致。当我们指定的泛型的类型时,编译器就不会进行自动类型推导了。
3.3:模板函数局限
我们在使用普通函数交换int类型数据和char类型数据时,形参使用两个int类型数据接收是不会出问题的,因为编译器是会对char类型进行整形提升的(主要还是因为char也是属于整形家族的)。但是对于模板函数来说,是不能进行类型转换的。
当模板函数与普通函数发生重载时,如果参数匹配的话系统是会默认优先调用普通函数的,(因为不需要进行推导)。但如果我们指定要调用模板函数,那么在调用时,在函数名后加一个<>就可以了。
四:类模板的使用
在使用类模板实例化对象时,必须显示指定类型,不然无法实例化对象。
因为在实例化对象时,需要给对象分配空间,如果不指定类型,编译器不知道该分配多大的
空间给对象。
当然我在上面的教程中,使用的类型都是基本的类型便于理解,我们也可指定自定义的类型。