学做网站知识,wordpress全景图片,网站建设方案书 广东,建设银行网上官方网站学习视频 文章目录 模板的概念函数模板函数模板语法函数模板注意事项函数模板案例普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性 类模板类模板与函数模板区别类模板中成员函数创建时机类模板对象做函数参数类模板与继承类模板成员函数类外实现类模板分文件…学习视频 文章目录 模板的概念函数模板函数模板语法函数模板注意事项函数模板案例普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性 类模板类模板与函数模板区别类模板中成员函数创建时机类模板对象做函数参数类模板与继承类模板成员函数类外实现类模板分文件编写类模板与友元类模板案例 模板的概念
模板就是建立通用的模具大大提高复用性
模板的特点
模板不可以直接使用它只是一个框架模板的额通用并不是万能的
函数模板
C 另一种编程思想称为泛型编程主要利用的技术就是模板C 提供两种模板机制函数模板和类模板
函数模板语法
函数模板的作用建立一个通用函数其函数返回值类型和形参类型可以不具体制定用一个虚拟的类型来代表。
templatetypename T
函数声明或定义解释 template — 声明创建模板 typename — 表面其后面的符号是一种数据类型可以用class代替 T — 通用的数据类型名称可以替换通常为大写字母
函数模板注意事项
注意事项
自动类型推导必须推导出一致的数据类型T才可以使用模板必须要确定出T的数据类型才可以使用
函数模板案例
案例描述
利用函数模板封装一个排序的函数可以对不同数据类型数组进行排序排序规则从大到小排序算法为选择排序分别利用char数组和int数组进行测试
普通函数与函数模板的区别
普通函数调用时可以发生自动类型转换隐式类型转换函数模板调用时如果利用自动类型推导不会发生隐式类型转换如果利用显示指定类型的方式可以发生隐式类型转换
templatetypename T
T myAdd(T a, T b){return ab;
}int a 10;
char b b;
myAdd(a, b);// 会报错使用函数模板时char不会自动转换为int类型普通函数与函数模板的调用规则
调用规则如下 1、如果函数模板和普通函数都可以实现优先调用普通函数 2、可以通过空模板参数列表来强制调用函数模板 3、函数模板也可以发生重载 4、如果函数模板可以产生更好的匹配优先调用函数模板
总结既然提供了函数模板最好就不要提供普通函数否则容易出现二义性
模板的局限性
局限性
模板的通用性并不是万能的
利用具体化Person的版本实现代码具体化优先调用
template bool myCompare(Person p1, Person p2){}总结
利用具体化的模板可以解决自定义类型的通用化学习模板并不是为了写模板而是在STL能够运用系统提供的模板
类模板
类模板的作用
建立一个通用类类中的成员 数据类型可以不具体制定用一个虚拟的类型来代表
总结类模板和函数模板语法相似在声明模板template后面加类此类称为类模板
类模板与函数模板区别
类模板与函数模板区别主要有两点
类模板没有自动类型推导的使用方式类模板在模板参数列表中可以有默认参数
总结
类模板使用只能用显示指定类型方式类模板中的模板参数列表可以有默认参数
类模板中成员函数创建时机
类模板中成员函数和普通类中成员函数创建时机是有区别的
普通类中的成员函数一开始就可以创建类模板中的成员函数在调用时才创建
总结类模板中的成员函数并不是一开始就创建的在调用时才去创建。因为只有在调用时才能知道模板所表示的具体类型去创建实例。
类模板对象做函数参数
学习目标
类模板实例化出的对象向函数传参的方式
一共有三种传入方式
指定传入的类型 \; —直接显示对象的数据类型参数模板化 \;\;\;\;\;\;\; —将对象中的参数变为模板进行传递整个类模板化 \;\;\;\; —将这个对象类型 模板化进行传递 使用 typeid().name() 可查看模板代替的类型 总结
通过类模板创建的对象可以有三种方式向函数中进行传参使用比较广泛是第一种指定传入的类型
类模板与继承
当类模板碰到继承时需要注意以下几点
当子类继承的父类是一个类模板时子类在声明的时候需指定出父类中T的类型
class Son: public Baseint如果不指定编译器无法给子类分配内存如果想灵活指定出父类中T的类型子类也需变为类模板
templateclass T1
class Son2: public BaseT1
Son2int s2总结如果父类是类模板子类需要指定出父类中T的数据类型
类模板成员函数类外实现
学习目标能够掌握类模板中的成员函数类外实现
总结类模板中成员函数类外实现时需要加上模板参数列表
templateclass T1, class T2
void PersonT1, T2::showPerson(){}类模板分文件编写
学习目标
掌握类模板成员函数文件编写产生的问题以及解决方法
问题
类模板中成员函数构建时机是在调用阶段导致分文件编写时链接不到
解决
解决方式1直接包含.cpp源文件解决方式2将声明和实现写在同一个文件中并更改后缀名为.hpphpp是约定的名称并不是强制
总结主流的解决方式是第二种将类模板成员函数写到一起并将后缀名改为.hpp
类模板与友元
学习目标
掌握类模板配合友元函数的类内和类外实现
全局函数类内实现 - 直接在类内声明友元即可
friend void printPerson(PersonT1, T2 p){cout 姓名 p.m_Name 年龄 p.m_Age endl;
}全局函数类外实现 - 需要提前让编译器知道全局函数的存在 因为是全局函数实现所以不需要加作用域 总结建议全局函数做类内实现用法简单而且编译器可以直接识别
类模板案例
案例描述实现一个通用的数组类要求如下
可以对内置数据类型以及自定义数据类型的数据进行存储将数组中的数据存储到堆区构造函数中可以传入数组的容量提供对应的拷贝构造函数以及operator防止浅拷贝问题提供尾插法和尾删法对数组中的数据进行增加和删除可以通过下标的方式访问数组中的元素可以获取数组中当前元素个数和数组的容量