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

前言

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

总结

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

门牙会稍息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值