C++基础(10)——函数模板和类模板

  • Post author:
  • Post category:其他


前言



本文主要介绍了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:全局函数类外实现


总结













以上就是本文的全部内容,非常感谢你能看到这



版权声明:本文为weixin_56646002原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。