模板 (泛型编程)
函数模板
语法:
template <typename 形参名,typename 形参名,......> 返回类型 函数名(参数列表)
{
函数体
}
- 定义函数模板时
typename
关键字可以替换成class
,效果一样。template<class T>
- 自动类型推导,必须推导出一致的数据类型T才可以使用。
- 模板必须要确定出T的数据类型,才能使用。
- 函数模板调用时,如果利用自动类型推导,不可以发生隐式类型转换。
- 函数模板调用时,如果显示指定类型,可以发生隐式类型转换。
- 如果函数模板和普通函数都可以调用,优先调用普通函数。
- 可以通过空模板参数列表的形式强制调用函数模板。
- 函数模板可以发生函数重载。
- 如果函数模板可以产生更好的匹配,优先调用函数模板。
- 函数模板针对特定类型可以具体化。例如
person
类型:
//通用模板
template<class T>
bool myCompare(T a, T b)
{
...
}
//具体化
template<> bool myCompare(Person p1, Person p2)
- 利用具体化的模板可以解决自定义类型的通用化。
类模板
语法:
template<typename 形参名,class 形参名,…> class 类名
{ ... };
- 定义类模板时
typename
关键字可以替换成class
,效果一样。template<class T>
- 类模板没有自动类型推导的使用方式。只能用显示指定类型。
- 类模板在模板的参数列表中可以有默认参数类型。
template<class NameType, class AgeType = int>
class Person
{
...
};
- 类模板中的成员函数在调用时才创建。
STL标准模板库
智能指针
- 自动申请和释放内存
- unique_ptr
引用
引用做参数
运算符重载
//=号的运算符重载
Person operator=(Person &p)
{
...
}
虚函数和纯虚函数
//虚函数
virtual void myShow()
{
...
}
//纯虚函数
virtual void myShow() = 0;
静态成员
静态成员变量
- 所有对象共享同一份数据
- 在编译阶段分配内存
- 类内声明,类外初始化
- 可以通过对象进行访问,也可以通过类名直接访问
- 静态成员变量也是有访问权限的,私有的静态成员变量在类外是无法访问的。
静态成员函数
- 所有对象共享一个函数
- 静态成员函数只能访问静态成员变量
- 可以通过对象进行调用,也可以通过类名直接进行调用。
struct和class的区别
struct和class只有一个区别,就是默认的权限不同。也可以用struct来写类。
- class的默认权限是私有
- struct的默认权限是公共