编程类型:
一、面向过程:接近事实,代码量大,维护难,强聚合
二、面向对象:(多态)接口简单,代码结构清晰,但设计难度大
三、模板编程(泛型编程):特点:(减少代码量)生成代码的代码
通过函数模板写的模板函数,在实例化(编译,运行前)时自动推导生成代码。所以模板参数不能是指针、对象(因为二者是运行时确定的)
多态
动态多态 | 静态多态(泛型) | |
代码生成期间 | 运行期间 | 编译期间 |
特点 | 面向对象(例:纯虚数) | 有统一接口,运行速度快,非强制执行。但更难调试。 |
模板编程
注意:
1、不能像编写普通类一样分成两个文件,.cpp文件包含.h(头)文件。这样会出错,因为定义的时候.h文件换为相应的数据类型(例<int>),但是.cpp文件还是(例<T>)。所以不用分开,全部写在头文件(写在头文件里的函数默认是inline函数)
特殊方法:尾分离(.cpp可改为.pcc)
2、模板参数可以传入推导类型的值,但必须是常量
3、在模板类里面,不能直接使用成员变量,需做接口(例:GetValue();SetValue();)
类模板
模板类
成员模板:类(可以是非模板类)里面的模板
若既有类模板又有成员模板,并且声明实现分开写时,类模板必须写在前面
模板函数
模板函数不是单纯地函数,它是用来生成函数的模板(不会凭空的生成)
模板参数列表里的参数必须在函数参数列表或中使用一次
若指定返回值(如下)则函数可以运行(但没意义,不推荐)
template<typename T>
const T Max(int lhs,int rhs)
{
return lhs>rhs?lhs:rhs;
}
int main()
{
Max<double>(1,2);
return 0;
}
模板类
例:
template<typename T>
class Demo
{
...
};
模板类的继承
非模板类可继承模板类(需写出特化类型)
例:(继承上类)class Other:public Demo<char>{};
模板函数的重载(不支持提升转换)
条件:模板参数或函数参数不同;或同名的普通函数
//例:
//原型
template<typename T>
bool Max(T lhs,T rhs)
{
return lhs>rhs?lhs:rhs;
}
//重载一
template<typename T1,typename T2>
const T1 Max(T2 lhs,T2 rhs)
{
return lhs>rhs?lhs:rhs;
}
//重载二
template<typename T>
const T Max(T lhs,T rhs)
{
return lhs>rhs?lhs:rhs;
}
模板的特化(属于函数模板,不是重载,可以提升转换)
模板函数:
例:原型:同上 特化:template<>const char*Max(const char*lhs,const char*rhs){};
模板类:
全特化:相当于一个全新的类,模板类不会生成
写法:类名<特化类型>
偏特化:特化具体方法,其余的会自动生成
写法:类名<特化类型>::函数名(参数)
//原型:同上