【C++】模板初阶 本是古典 何须时尚 2021-09-09 03:40 375阅读 0赞 ### 文章目录 ### * 一、泛型编程 * 二、函数模板 * * 1.函数模板概念 * 2.函数模板格式 * 3.函数模板的实例化 * 三、类模板 * * 1.类模板的定义 * 2.类模板的实例化 * 感谢阅读,如有错误请批评指正 -------------------- # 一、泛型编程 # 以交换两个变量的值为例: 代码如下: void Swap(int& a, int& b) { int temp = a; a = b; b = temp; } void Swap(double& a, double& b) { double temp = a; a = b; b = temp; } void Swap(char& a, char& b) { char temp = a; a = b; b = temp; } //同理可写出unsigned int,float……类型的交换函数 函数重载可以存在多个同名的Swap函数、引用的使用已经比C语言已经方便了很多,但是以下两个方面仍很难处理: (1)重载的函数仅仅只是类型不同,而逻辑完全相同,代码的复用率比较低,只要有新类型出现,就需要增加对应的函数。 (2)代码的可维护性比较低,由于逻辑相同,一个出错所有的重载均出错。 那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢? C++提供模板template来实现。 -------------------- # 二、函数模板 # ## 1.函数模板概念 ## 函数模板代表了一个函数集合,该函数模板与类型无关,在使用时被参数化,根据实参类型产生适用于不同类型的函数。 -------------------- ## 2.函数模板格式 ## template<typename T1, typename T2,…,typename Tn> 返回值类型 函数名(参数列表)\{\} 具体写法如下: //T也可为其它名称 template<typename T>//注意没有逗号 void Swap(T& left, T& right) { T temp = left; left = right; right = temp; } int main() { //下面的Swap函数时两个不同的函数,因为他们的参数列表不同 //一个参数是两个int,另一个的参数是两个double int a = 1, b = 2; Swap(a, b); double c = 3.14, d = 3.15; Swap(c, d); return 0; } 调试查看反汇编代码,发现函数地址不同,显然是两个不同的函数。 查看反汇编结果如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MTk4MzYwNA_size_16_color_FFFFFF_t_70] **typename是用来定义模板参数关键字的,也可以使用class,但切记不能使用struct代替class。** 注意一个模板只能在之后的第一个函数中使用,剩余的函数无法再使用。 template<class X> void Swap(X& a, X& b) { X tmp = a; a = b; b = tmp; } void f(X a)//error { } -------------------- ## 3.函数模板的实例化 ## 代码如下: template<class T> T add(T a, T b) { return a + b; } int main() { int a = 1, b = 2; add(a, b);//√ double c = 3.14, d = 3.15; add(c, d);//√ add(a, c);//error //该语句无法通过编译,编译器通过a推演得出T应为int,但通过c推演得出T应为double //二者矛盾,编译器无法确定T到底应该是哪一种类型,报错 //以下两种办法可以解决 //1.强制类型转换 add(a, (int)c); //2.显式实例化:在函数名后的<>中指定模板参数的类型 add<int>(a, c); add<double>(a, c); return 0; } -------------------- # 三、类模板 # ## 1.类模板的定义 ## 以顺序表为例,在C语言中,通过下面的方式使代码面对不同类型的数据时尽可能复用。 代码如下: typedef int DataType; struct Vector { DataType _a; int _size; int _capacity; }; //对顺序表的操作函数 //... 但是这也有一个问题,就是在同一份代码中,无法同时创建一个数据类型为int的顺序表和一个数据类型为double的顺序表,如果想要实现,又需要重写一份几乎完全相同的代码。 -------------------- C++中可使用类模板来解决上述问题。 代码如下: template<class T> class Vector { public: //成员函数 //... private: T* _a; int _size; int _capacity; }; int main() { Vector<int> v1;//数据类型为int的顺序表v1 Vector<double> v2;//数据类型为double的顺序表v2 return 0; } -------------------- ## 2.类模板的实例化 ## 类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,实例化的结果才是真正的类。 上面的代码中Vector是类名,Vector < int >才是类型。 **模板不支持分离编译**,也就是说声明放在.h文件中,而定义放在.cpp中。 -------------------- # 感谢阅读,如有错误请批评指正 # [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MTk4MzYwNA_size_16_color_FFFFFF_t_70]: /images/20210813/38098b6052314fb8ab74309ee63b2272.png
相关 【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶) 【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶) 妖狐艹你老母/ 2024年04月22日 12:10/ 0 赞/ 81 阅读
相关 c++模板初阶 前言 在我们学习c语言中,我们发现很多逻辑一样但函数的数据类型不一样,我们都需重新写,这样就有点代码冗余了。当来到了c++就可以很好的解决这一问题,运用模板。这个模板其实 逃离我推掉我的手/ 2024年04月01日 17:47/ 0 赞/ 105 阅读
相关 【C++初阶】函数模板与类模板 文章目录 引言.泛型编程 一.函数模板 1.基本使用 2.拔高训练 2-1自动推演实例化和显式实例化 忘是亡心i/ 2024年04月01日 15:11/ 0 赞/ 93 阅读
相关 【C++初阶】:模板初阶 模板初阶 一.函数模板 1.简单使用 2.模板原理 3.函数模板的实例化 4.模板参数的匹配原则 二.类 短命女/ 2024年03月22日 19:12/ 0 赞/ 104 阅读
相关 【C++初阶】:模板进阶 模板进阶 一.非类型模板参数 二.模板的特化 1.概念 2.函数模板特化 3.类的特化 1.全特化 雨点打透心脏的1/2处/ 2024年03月18日 00:20/ 0 赞/ 124 阅读
相关 【C++精华铺】8.C++模板初阶 目录 1. 泛型编程 2. 函数模板 2.1 函数模板的概念及格式 2.2 函数模板的原理 2.3 模板的实例化 2.4 模板参数的匹配原则 3. 类模板 た 入场券/ 2023年10月14日 21:26/ 0 赞/ 27 阅读
相关 模板初阶 一、泛型编程 1、函数重载的缺点: (1)重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数 (2)代码的可维护性比较低,一个 拼搏现实的明天。/ 2022年03月21日 04:30/ 0 赞/ 230 阅读
相关 【C++】模板初阶 文章目录 一、泛型编程 二、函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的实例化 三、类模板 本是古典 何须时尚/ 2021年09月09日 03:40/ 0 赞/ 376 阅读
还没有评论,来说两句吧...