前言
本文主要介绍了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数据类型
文章来源:https://www.toymoban.com/news/detail-492487.html
2:全局函数类外实现
文章来源地址https://www.toymoban.com/news/detail-492487.html
总结
以上就是本文的全部内容,非常感谢你能看到这
到了这里,关于C++基础(10)——函数模板和类模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!