北京app网站开发,做一个电子商务网站,选择佛山顺德网站设计,seo的流程是怎么样的目录
1.泛型编程
2.函数模板
2.1函数模板的定义格式
2.2函数模板的实例化
2.3函数模板参数的匹配原则
3.类模板
3.1类模板的定义格式
3.2类模板的实例化
3.3模板的分离编译 1.泛型编程 泛型编程#xff1a;编写与类型无关的通用代码#xff0c;是代码复用的一种手段…目录
1.泛型编程
2.函数模板
2.1函数模板的定义格式
2.2函数模板的实例化
2.3函数模板参数的匹配原则
3.类模板
3.1类模板的定义格式
3.2类模板的实例化
3.3模板的分离编译 1.泛型编程 泛型编程编写与类型无关的通用代码是代码复用的一种手段模板是泛型编程的基础 为什么存在泛型编程 我们之前实现过交换两个整型的函数如下 但是要实现交换两个浮点型数据时swap函数就不可用了 我们需要再编写交换两个浮点型的swap函数 但是这样就造成了大量的代码重复因为这两个swap函数只有参数的类型不同 解决方案 1️⃣函数重载 重载的函数仅仅是类型不同代码复用率比较低只要有新的类型出现时仍需要用户自己增加对应的函数代码的可维护性比较低一个出错可能所有的重载出错 2️⃣泛型编程 给编译器一个模板让编译器根据不同的类型由该模板生成代码 2.函数模板
2.1函数模板的定义格式 函数模板代表了一个函数家族该函数模板与类型无关在使用时被参数化根据实参类型产生函数的特定类型版本 函数模板格式 templatetypename T1, typename T2, ..... , typename Tn 返回值类型 函数名参数列表{ } Note typename是用来定义模板参数的关键字也可以使用class但不能使用struct代替class 2.2函数模板的实例化 函数模板是一个蓝图它本身并不是函数是编译器用使用方式产生特定具体类型函数的模具。模板就是将本来应该我们做的重复的事情交给给了编译器 在编译器编译阶段编译器需要根据传入实参类型来推演生成对应类型的函数以供调用。如上例中当使用char类型使用函数模板时编译器通过对实参类型的推演将T确定为char类型然后产生一份专门处理char类型的代码对于int和float类型同理 用不同类型的参数使用函数模板称为函数模板的实例化。 函数模板的实例化分类 隐式实例化让编译器根据实参推演函数模板参数的实际类型显式实例化在函数名后的中指定模板参数的实际类型 如上图Add(a1, b1)该语句编译不能通过当编译器推演其实参类型时首先通过实参a1将T推演为int通过实参b1将T推演为double但是模板参数列表中只要一个T编译器无法确定此处T的具体类型因此报错 Note 在模板实例化时编译器一般不会进行类型转换操作 解决方案 用户自己强制转换Add(a1,(int) b1)使用显式实例化模板参数定义类型 2.3函数模板参数的匹配原则 1️⃣一个非模板函数可以和一个同名的函数模板同时存在而且该函数模板还可以被实例化为这个非模板函数 2️⃣对于非模板函数和同名函数模板如果其他条件都相同在调用时会优先调用非模板函数而不是从该模板实例化一个函数。如果模板可以产生一个具有更好匹配的函数那么将选择模板 3️⃣模板函数不允许自动类型转换但普通函数可以进行自动类型转换 3.类模板
3.1类模板的定义格式 类模板格式 templateclass T1,class T2, ..... , class Tn class 类模板名 { //类内成员定义 } //动态顺序表的类模板
templateclass T
class Vector
{
public://构造函数Vector(size_t capacity 10):_pDate(new T[capacity]), _size(0), _capacity(10){}//析构函数在类中声明类外定义~Vector();//void PushBack(const T data);//void PopBack();size_t Size(){return _size;}//运算符[]重载//定义成内联函数提高效率inline T operator[](size_t pos){assert(pos _size);return _pDate[pos];}private:T* _pDate;size_t _size;size_t _capacity;
};
//类外定义成员函数:需要加模板参数列表
template class T
VectorT::~Vector()
{if (_pDate){delete[] _pDate;}_size _capacity 0;
}
3.2类模板的实例化 类模板实例化和函数模板实例化不同类模板实例化需要在类模板名字后跟然后将实例化的类型放在中即可类模板的名字不是真正的类而实例化的结果才是真正的类 int main()
{//Vector类名Vectorint s1才是类型Vectorint s1;Vectordouble s2;return 0;
}
3.3模板的分离编译 模板不支持分离编译会产生链接错误 解决方案 显式实例化 在定义的地方指定是模板 不分离定义到.h和.cpp中 把类模板定义到.h文件中包括声明和定义实例化后编译就知道函数的地址不需要链接去符号表中去找函数的地址