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

前言

本文主要介绍了C++中函数模板和类模板基本知识

6.1:函数模板

模板函数的定义

template+函数的定义或声明

C++基础(10)——函数模板和类模板_第1张图片

模板函数的两种使用方法(编译器自动推测、显示指定T的类型)

C++基础(10)——函数模板和类模板_第2张图片

注意事项:模板一定要确定指出T的数据类型才可以使用;T由编译器自动推导出来,如果类型不一致也不可以使用

6.2:普通函数和模板函数的区别和调用规则

普通函数可以发生自动类型转换。模板函数如果使用自动类型推导不能发生自动类型转换;模板函数如果使用显示指定类型可以发生自动类型转换。

C++基础(10)——函数模板和类模板_第3张图片

普通函数和模板函数的调用规则

1:如果普通函数和模板函数重名且都可以调用,优先调用普通函数

C++基础(10)——函数模板和类模板_第4张图片

2:通过空模板的方式强制调用模板函数

C++基础(10)——函数模板和类模板_第5张图片

3:模板函数也可以发生重载

C++基础(10)——函数模板和类模板_第6张图片

4:如果模板函数可以产生更好的匹配,优先使用模板函数(防止普通函数的自动类型转换)

C++基础(10)——函数模板和类模板_第7张图片

6.3:模板函数的局限性(函数模板具体化)

模板函数传入的参数不是万能的,有一定的限制

C++基础(10)——函数模板和类模板_第8张图片

通过运算符重载可以实现自定义数据类型的比较

C++基础(10)——函数模板和类模板_第9张图片

也写一个指定T类型的模板函数,之后编译器会优先调用这个函数

C++基础(10)——函数模板和类模板_第10张图片

6.4:类模板概念和函数模板比较

类模板定义:

C++基础(10)——函数模板和类模板_第11张图片

类模板可以有默认参数类型

C++基础(10)——函数模板和类模板_第12张图片

使用类模板的时候要指定数据类型,编译器不会自己推导,模板函数会自己推导

C++基础(10)——函数模板和类模板_第13张图片

类模板中的成员函数不是在一开始就创建的,而是在运行的时候创建的

C++基础(10)——函数模板和类模板_第14张图片

6.5:类模板对象做函数的参数

 1:直接指定参数类型void func1(Person &p) 

C++基础(10)——函数模板和类模板_第15张图片

 2:参数模板化

C++基础(10)——函数模板和类模板_第16张图片

打印一下T1,T2的类型typeid(T1).name()

C++基础(10)——函数模板和类模板_第17张图片

3:将整个类进行模板化

C++基础(10)——函数模板和类模板_第18张图片

6.6:类模板和继承

当子类继承的父类是一个模板函数时,要先指定T的类型,要不然编译器不知道给子类开辟多大的内存空间。同理父类模板想用sizeof打印大小时也需要先指定T的类型

C++基础(10)——函数模板和类模板_第19张图片

如果想灵活指定父类模板中T的类型,子类也需要模板化

C++基础(10)——函数模板和类模板_第20张图片

6.7:类模板的类外实现

C++基础(10)——函数模板和类模板_第21张图片

6.8:类模板的分文件编写和解决

将类的定义和成员函数的实现分开写,在调用模板类创建对象,使用类外实现的成员函数会报错,因为类的成员函数是在运行时才创建

main.cpp

C++基础(10)——函数模板和类模板_第22张图片

person.h

C++基础(10)——函数模板和类模板_第23张图片

person.cpp

C++基础(10)——函数模板和类模板_第24张图片

如果只调用类内实现的showName()函数是不会报错的

C++基础(10)——函数模板和类模板_第25张图片

因为main.cpp中只包含了person.h文件,main.cpp是不知道showAge()具体是怎么实现的,编译的时候会报错

C++基础(10)——函数模板和类模板_第26张图片

将类的定义和类成员函数放在同一个文件中,然后再main.cpp中进行包含就不会报错了

C++基础(10)——函数模板和类模板_第27张图片

person.hpp

C++基础(10)——函数模板和类模板_第28张图片

6.9:类模板和友元

1:全局友元函数类内实现

main.cpp

C++基础(10)——函数模板和类模板_第29张图片

person.hpp

C++基础(10)——函数模板和类模板_第30张图片

打印一下T1、T2数据类型

C++基础(10)——函数模板和类模板_第31张图片

2:全局函数类外实现

C++基础(10)——函数模板和类模板_第32张图片

总结

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

你可能感兴趣的:(C++学习,c++,开发语言)