用{}初始化聚合对象如数组
1)模板
C++另一种编程思想--泛型编程,主要利用的技术是模板。----C++提供两种模板机制:函数模板和类模板
1)函数模板
1)函数模板
作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。---提高代码复用性,将类型参数化
语法:
template<typename T>
函数声明或定义
解释:1)template----声明创建模板变量
2)typename----表明其后的符号是一种数据类型,可用class代替
3)T----通用的数据类型,名称可以替换,通常为大写字母
使用方式:
1)自动类型推导
直接将数据传入函数模板的函数中,让编译器自己推导出数据类型-----如mySwap(a, b);
2)显示指定类型
用<>指定模板数据类型----如mySwap<int>(a, b);
2)函数模板注意事项
自动类型推导使用时----必须推导出一致的数据类型T
模板必须要确定出T的数据类型,才可以使用-----即模板不能直接使用
4)函数模板和普通函数的区别
1)普通函数调用可以发生隐式类型转换
2)函数模板 ----自动类型推导方式,不可以发生隐式类型转换,编译器自动判断出数据类型,不会自己转换数据类型
----显示指定类型方式,可以发生隐式类型转换,编译器直接将数据类型转换成指定的数据类型
5)普通函数与函数模板的调用规则-----一般要避免重名,了解即可
1)普通函数和函数模板都可实现,优先掉普通函数
2)可通过空模板参数列表(即<>)来强制调用空模板
3)函数模板可以发生重载
4)若函数模板可以产生更好的匹配,优先调用函数模板---如若调用普通函数需要编译器自己转换数据类型,而函数模板不需要的情况
3)类模板
作用:建立一个通用的类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表。
1)类模板语法
template<typename T>-----可用class代替typename
类
2)类模板与函数模板区别
1)类模板没有自动类型推导的使用方式
2)类模板在模板参数列表中可以有默认参数(类型)
3)类模板中的成员函数创建时机
----普通类中的成员函数一开始就可以创建,类模板中的成员函数在调用时才创建
4)类模板对象做函数参数
类模板实例化出对象,向函数传参的方式
传入方式: 1)指定传入的类型-----比较常用,直接显示对象的数据类型
2)参数模板化----将对象中的参数变为模板进行传递---函数模板中形参为对象中的参数的模板化T
3)整个类模板化----将此对象类型模板化进行传递---函数模板中形参变为对象的模板化T
5)类模板与继承
注意事项:
1)子类继承的父类是一个类模板时,子类声明时,要指定父类中T的数据类型
2)若不指定,编译器无法给子类分配内存
3)若想灵活指定出父类中T的类型,子类也需变为模板
6)类模板成员函数类外实现
1)补充template行,让编译器认识模板参数列表T
2)实现时函数作用域::前补充参数列表<T>----若不加<T>,则只是普通的成员函数类外实现
7)类模板分文件编写
之前忘记写的小点:#pragma once----防止头文件重复包含
常遇到问题:类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到
两种解决方式:
1)运行文件中,直接包含.cpp源文件----没道理让人看源文件,一般少用
2)将声明和实现写到同一个文件中,并改后缀名为.hpp,hpp为约定名称(一看hpp就知道是类模板),并非强制--主流
8)类模板与友元
掌握类模板配合友元函数的类内和类外实现
全局函数类内实现--直接在类内用friend声明友元并实现即可
全局函数类外实现--提前让编译器知道全局函数的存在---类内声明友元时要加模板参数列表<>,类外要加template让编译器明白
比较复杂