从零开始学C++07--模板

文章详细介绍了C++中的模板机制,包括函数模板和类模板的使用。函数模板允许创建通用函数,而类模板则用于构建泛型类。自动类型推导、模板参数的指定以及模板的局限性,如对数组和自定义类型的处理,都是讨论的重点。类模板的成员函数在调用时创建,这可能导致在分文件编写时的链接问题,解决方法是将声明和实现放在同一文件中。此外,类模板与继承、友元函数的交互也有所阐述。
摘要由CSDN通过智能技术生成

模板

特点

不能直接使用,只是个框架
模板的通用并不是万能

模板机制

函数模板

建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表,在使用的时候再确定
在这里插入图片描述

语法

在这里插入图片描述

解释

在这里插入图片描述

交换函数中只是函数名和形参不一样

在这里插入图片描述

应用

1、在模板前加一行代码,在调用的时候可以选择自动类型推导,或者显式指定类型
在这里插入图片描述

注意事项

自动推导,必须推导出一致的数据类型T才可以使用
模板必须要确定出T的数据类型
在调用的时候必须要加一个int类型,要不然就会报错
在这里插入图片描述

普通函数与函数模板的区别

1、普
2、函数模板用自动类型推到,不可以发生隐式类型转换
3、函数模板用显示指定类型,可以发生隐式类型转换
普通函数:
char 被转换成了int
在这里插入图片描述
函数模板:
这种会报错,因为编译器不清楚应该转换成char 还是int
在这里插入图片描述
显示指定类型
如果传进来是char 那么久自动转换成int
在这里插入图片描述

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

1、同时存在函数模板和普通函数的时候,优先调用普通函数
2、可以通过空模板参数列表来强制调用函数模板
3、函数模板也可以发生重载‘
4、如果函数模板可以产生更好的匹配,优先调用函数模板
在这里插入图片描述
在这里插入图片描述

模板局限性

如果传入的a和b是一个数组那么就无法实现了
在这里插入图片描述
如果传入的是自定义类型,也无法运行
在这里插入图片描述

类模板语法

类模板作用

建立一个通用类,类中的成员,数据类型可以不具体制定,用一个虚拟的类型代表
在这里插入图片描述

语法


在这里插入图片描述
在这里插入图片描述

类模板与函数模板的区别

1、类模板没有自动 类型推导的使用方式
2、类模板在模板参数列表中可以有默认参数
此处模板参数列表默认是整型
在这里插入图片描述

调用的时候,可以不用声明agetype的类型,也不会报错
在这里插入图片描述
在这里插入图片描述

类模板中成员的创建时机

1、类模板中成员函数在调用时候才创建
因为一开始无法确定数据类型,不知道调用哪个,只有在调用的时候才去创建
定义两个类在这里插入图片描述
类模板
在这里插入图片描述
在这里插入图片描述

类模板对象做函数参数

类模板实例化出对象,向函数传参的方式

三种方式

1、指定传入类型,–直接显示对象的数据类型
2、参数模板化,将对象中的参数变为模板进行传递
3、整个类模板化,将这个对象类型模板化进行传递
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类模板与继承

类模板碰到继承时
1、当子类继承的是一个类模板时,子类在声明的时候,要制定出父类中的类型
2、如果不指定,编译器无法给子类分配内存
3、如果想灵活制定出父类中T的类型,子类也需变为类模板
父类
在这里插入图片描述
子类继承的规则
在这里插入图片描述
也可以再让子类多命名几个类模板,给父类用,T1给自己,T2给父类
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

类模板成员函数类外实现

把类内的函数声明拖到类外,再加作用域,同时在前面加类模板声明
类内声明
在这里插入图片描述
类外实现
在这里插入图片描述
在这里插入图片描述

类模板的分文见编写

问题

类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到

解决

直接包含.cpp文件
将声明和实现写在同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制

类模板与友元

全局函数类内实现,直接在类内声明友元即可
全局函数类外实现,需要提前让编译器知道全局函数存在

类外实现比较麻烦

先让编译器知道哪些用了类模板

在这里插入图片描述
在这里插入图片描述
}

在这里插入图片描述
建议全局函数做雷内实现,简单而且编译器可以识别

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值