前言 本文主要介绍了C++中函数模板和类模板基本知识 6.1:函数模板 模板函数的定义 template<typename T>+函数的定义或声明 模板函数的两种使用方法(编译器自动推测、显示指定T的类型) 注意事项:模板一定要确定指出T的数据类型才可以使用;T由编译器自动推导出来,如果类型不一致也不可以使用 6.2:普通函数和模板函数的区别和调用规则 普通函数可以发生自动类型转换。模板函数如果使用自动类型推导不能发生自动类型转换;模板函数如果使用显示指定类型可以发生自动类型转换。 普通函数和模板函数的调用规则 1:如果普通函数和模板函数重名且都可以调用,优先调用普通函数 2:通过空模板的方式强制调用模板函数 3:模板函数也可以发生重载 4:如果模板函数可以产生更好的匹配,优先使用模板函数(防止普通函数的自动类型转换) 6.3:模板函数的局限性(函数模板具体化) 模板函数传入的参数不是万能的,有一定的限制 通过运算符重载可以实现自定义数据类型的比较 也写一个指定T类型的模板函数,之后编译器会优先调用这个函数 6.4:类模板概念和函数模板比较 类模板定义: 类模板可以有默认参数类型 使用类模板的时候要指定数据类型,编译器不会自己推导,模板函数会自己推导 类模板中的成员函数不是在一开始就创建的,而是在运行的时候创建的 6.5:类模板对象做函数的参数 1:直接指定参数类型void func1(Person<string, int> &p) 2:参数模板化 打印一下T1,T2的类型typeid(T1).name() 3:将整个类进行模板化 6.6:类模板和继承 当子类继承的父类是一个模板函数时,要先指定T的类型,要不然编译器不知道给子类开辟多大的内存空间。同理父类模板想用sizeof打印大小时也需要先指定T的类型 如果想灵活指定父类模板中T的类型,子类也需要模板化 6.7:类模板的类外实现 6.8:类模板的分文件编写和解决 将类的定义和成员函数的实现分开写,在调用模板类创建对象,使用类外实现的成员函数会报错,因为类的成员函数是在运行时才创建 main.cpp person.h person.cpp 如果只调用类内实现的showName()函数是不会报错的 因为main.cpp中只包含了person.h文件,main.cpp是不知道showAge()具体是怎么实现的,编译的时候会报错 将类的定义和类成员函数放在同一个文件中,然后再main.cpp中进行包含就不会报错了 person.hpp 6.9:类模板和友元 1:全局友元函数类内实现 main.cpp person.hpp 打印一下T1、T2数据类型 2:全局函数类外实现 总结 以上就是本文的全部内容,非常感谢你能看到这