开发网站开票名称是什么原因,猪八戒设计网站官网,兴县做网站,网站开发询价表模板下载1. 泛型编程实现一个通用的交换函数#xff0c;使用函数重载虽然可以实现#xff0c;但是有以 下几个不好的地方#xff1a;1. 重载的函数仅仅是类型不同#xff0c;代码复用率比较低#xff0c;只要有新类型出现时#xff0c;就需要用户自己增加对应的函数2. 代码的可维…1. 泛型编程实现一个通用的交换函数使用函数重载虽然可以实现但是有以 下几个不好的地方1. 重载的函数仅仅是类型不同代码复用率比较低只要有新类型出现时就需要用户自己增加对应的函数2. 代码的可维护性比较低一个出错可能所有的重载均出错因此我们可以给编译器一个模子让编译器根据不同的类型利用该模子来生成代码呢泛型编程编写与类型无关的通用代码是代码复用的一种手段。泛型编程代码可以处理不同类型不同结构的数据模板是泛型编程的基础但模板不等于泛型编程。2. 函数模板2.1 函数模板概念 函数模板与类型无关在使用时被参数化根据实参类型产生函数的特定类型版本。方法要通用在实现时类型就不能具体化--类型给具体了方法只能处理该种类型其他处理不了2.1 函数模板格式templatetypename T1, typename T2,......,typename Tn返回值类型 函数名(参数列表){}举例加法模板#includeiostream
using namespace std;//方法要通用在实现时类型就不能具体化--类型给具体了方法只能处理该种类型其他处理不了
//要告诉编译器T是一个类型
//typedef double T; 这种方式错误实际上还是double类型//定义一个ADD模板
templatetypename T
T Add(const T left, const T right)
{cout typeid(T).name() endl;return left right;
}int main()
{Add(10, 20);Add(10.2, 2.0);return 0;
}注意typename是用来定义模板参数关键字也可以使用class(但是一般不用class定义类不要引起歧义)(不能使用struct代替class) 这也是二者区别之一2.3 函数模板的原理函数模板不是一个函数是一个规则在实例化之前只是对模板进行简单的语法检测在实例化之后根据用户对函数模板的实例化结果来生成处理对应类型的代码并对这些代码进行再次编译在编译器编译阶段对于模板函数的使用编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如当用double类型使用函数模板时编译器通过对实参类型的推演将T确定为double类型然后产生一份专门处理double类型的代码对于字符类型也是如此ADD12 //都为Int认为T为int类型则会根据模板生成处理int类型的ADDint函数
ADD2.14.2 //都为double认为T为double类型则会根据模板生成处理double类型的ADDdouble函数
ADD12 //都为char认为T为char类型则会根据模板生成处理int类型的ADDchar函数ADD12.2 //T到底设置为int,还是double类型编译器无法确定解决方法如下1.强转ADD1int2.22.增加模板templatetypename T, typename S对模板进行显式实例化明确指明模板参数列表中T的实际类型ADDdouble(1,2.2);2.4 函数模板的实例化 显式实例化在函数名后的中指定模板参数的实际类型显式实例化:明确指定了参数类表中T的实际类型不需要推演T的类型如上代码举例如果类型不匹配编译器会尝试进行隐式类型转换如果无法转换成功编译器将会报错隐式实例化没有明确指出参数类表中T的实际类型编译器需要推演用户传递的类型来确定模板参数列表T的类型如2.1中代码例子3. 类模板3.1 类模板的定义格式templateclass T1, class T2, ..., class Tn
class 类模板名
{// 类内成员定义
};
// 动态顺序表
// 注意Vector不是具体的类是编译器根据被实例化的类型生成具体类的模具
templateclass T
class Vector
{
public :Vector(size_t capacity 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}// 使用析构函数演示在类中声明在类外定义。~Vector();void PushBack(const T data)void PopBack()// ...size_t Size() {return _size;}T operator[](size_t pos)
{assert(pos _size);return _pData[pos];}private:T* _pData;size_t _size;size_t _capacity;
};
// 注意类模板中函数放在类外进行定义时需要加模板参数列表
template class T
VectorT::~Vector()
{if(_pData)delete[] _pData;_size _capacity 0;
}3.2 类模板的实例化类模板实例化与函数模板实例化不同类模板实例化需要在类模板名字后跟然后将实例化的类型放在中即可类模板名字不是真正的类而实例化的结果才是真正的类// Vector类名Vectorint才是类型
Vectorint s1;
Vectordouble s2;