赞
踩
模板就是建立通用的模具,大大提高复用性
模板的特点:
泛型编程
,主要利用的技术就是模板函数模板的作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。
template<typename T>
函数声明或定义
解释:
template — 声明创建模板
typename — 表面其后面的符号是一种数据类型,可以用class代替
T — 通用的数据类型,名称可以替换,通常为大写字母
注意事项:
案例描述
template<typename T>
T myAdd(T a, T b){
return a+b;
}
int a = 10;
char b = 'b';
myAdd(a, b);
// 会报错,使用函数模板时,char不会自动转换为int类型
调用规则如下:
1、如果函数模板和普通函数都可以实现,优先调用普通函数
2、可以通过空模板参数列表来强制调用函数模板
3、函数模板也可以发生重载
4、如果函数模板可以产生更好的匹配,优先调用函数模板
总结:既然提供了函数模板,最好就不要提供普通函数,否则容易出现二义性
局限性:
利用具体化Person的版本实现代码,具体化优先调用
template<> bool myCompare(Person &p1, Person &p2){
}
总结:
类模板的作用:
虚拟的类型
来代表总结:类模板和函数模板语法相似,在声明模板template后面加类,此类称为类模板
类模板与函数模板区别主要有两点:
总结:
类模板中成员函数和普通类中成员函数创建时机是有区别的:
总结:类模板中的成员函数并不是一开始就创建的,在调用时才去创建。因为只有在调用时才能知道模板所表示的具体类型,去创建实例。
学习目标:
一共有三种传入方式:
使用
typeid().name()
可查看模板代替的类型
总结:
当类模板碰到继承时,需要注意以下几点:
class Son: public Base<int>
template<class T1>
class Son2: public Base<T1>
Son2<int> s2
总结:如果父类是类模板,子类需要指定出父类中T的数据类型
学习目标:能够掌握类模板中的成员函数类外实现
总结:类模板中成员函数类外实现时,需要加上模板参数列表
template<class T1, class T2>
void Person<T1, T2>::showPerson(){
}
学习目标:
问题:
解决:
总结:主流的解决方式是第二种,将类模板成员函数写到一起,并将后缀名改为.hpp
学习目标:
全局函数类内实现 - 直接在类内声明友元即可
friend void printPerson(Person<T1, T2> p){
cout << "姓名:" << p.m_Name << "年龄:" << p.m_Age << endl;
}
全局函数类外实现 - 需要提前让编译器知道全局函数的存在
因为是全局函数实现,所以不需要加作用域
总结:建议全局函数做类内实现,用法简单,而且编译器可以直接识别
案例描述:实现一个通用的数组类,要求如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。