模板的目的时为了提高复用性,将类型参数化
函数模板-
建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表
- 语法:
template
(或class T) 函数声明或定义
有两种使用方法
- 自动类型推导
- 显示指定类型
- 普通函数和函数模板的区别:
- 普通函数可以发生自动类型转换(如把char类型转换成int类型)
- 函数模板用自动类型推导,不可以发生隐式类型转换
- 普通函数与函数模板调用规则
- 优先调用普通函数
- 可以通过空模板参数列表来强制调用函数模板
空模板参数列表:myAdd<>(a, b)
3.函数模板也可以发生重载
4.如果函数模板可以产生更好的匹配,优先调用函数模板
类模板建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表
语法同函数模板
类模板与函数模板区别- 类模板没有自动类型推导的使用方式
- 类模板在模板参数列表中可以有默认参数
类模板中的成员函数创建时机
普通类里的成员函数一开始就可以创建
类模板中的成员函数在调用时才可创建
类模板对象做函数参数三种传入方式
- 指定传入的类型-----直接显示对象的数据类型
4. template5. class Person { 6. public: 7. T1 name; 8. T2 age; 9. Person(T1 name, T2 age) { 10. this->name = name; 11. this->age = age; 12. } 13. 14. void show() { 15. cout << this->name << " " << this->age; 16. } 17. }; 18. 19. void test(Person p) { 20. p.show(); 21. } 22. 23. int main() { 24. Person p("小a", 100); 25. test(p); 26. }
2.参数模板化----将对象中的参数变为模板进行传递
templatevoid test(Person &p) { p.show(); }
3.整个类模板化----将这个对象类型模板化进行传递
template类模板与继承void test(T &p) { p.show(); }
当子类继承的父类是一个类模板时,子类在声明的时候,要指出父类中T的类型
如果不指定,编译器无法给子类分配内存
如果想灵活指定出父类中T的类型,子类也需变为类模板
类模板成员函数类外实现
类模板分文件编写template
Person
::funcName(T1 a,T2 b) {
}
问题:类模板中成员函数的创建时机是在调用阶段,导致分文件编写时连接不到
解决方式:
- 直接包含.cpp源文件
- 将.h和.cpp中的内容写到一起,并更改后缀名为.hpp
类模板与友元
- 全局函数类内实现-直接在类内声明友元即可
- 全局函数类外实现-需要提前让编译器知道全局函数的存在:加空模板参数列表,且把声明放到前边
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)