C++中的一种编程思想称为泛型编程,主要利用的技术就是模板。
C++提供两种模板机制:函数模板和类模板
一、函数模板
总结:
1、函数模板利用关键字template
2、使用函数模板有两种方式:自动类型推到、显示指定类型
3、模板的目的是为了提高复用性,将类型参数化
注意事项:
1、自动类型推导,必须推导出一致的数据类型T,才可以使用
2、模板必须要确定出T的数据类型,才可以使用
普通函数和函数模板的调用规则:
1、如果函数模板和普通函数都可以实现,优先调用普通函数
2、可以通过空模板参数列表来强制调用函数模板 。 如:myPrint<>(a, b); //<>里不用写东西
3、函数模板也可以发生重载。 重载后不加<>直接调用 如:myPrint(a, b, c);
4、如果函数模板可以产生更好的匹配,优先调用函数模板
一般来说,既然提供了函数模板,最好就不要提供普通函数,否则容易出现二义性。
二、类模板
类模板和函数模板区别主要有两点:
1、类模板没有自动类型推导的使用方式
2、类模板在模板参数列表中可以有默认参数
如:template<class NameType,class AgeType = int>
那么在创建对象的时候就不用指定int类型,如:Person< string > p2(“张三”, 99);
类模板中成员函数和普通类中成员函数创建时机的区别:
1、普通类中的成员函数一开始就创建
2、类模板中的成员函数在调用时才创建
类模板对象做函数参数,即类模板实例化出对象,向函数传参的方式,一共有三种传入方式:
1、指定传入的类型:直接显示对象的数据类型 ( 最常用第一种)
2、参数模板化:将对象中的参数变为模板进行传递
3、整个类模板化:将这个对象类型 模板化进行传递
类模板与继承
1、当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型
2、如果不指定,编译器无法给子类分配内存
3、如果想灵活指定出父类中T的类型,子类也需要变为类模板
类模板分文件编写
问题:类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到
解决:
1、直接包含.cpp文件
2、将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制