【C++初阶】:模板初阶 短命女 2024-03-22 19:12 39阅读 0赞 #### 模板初阶 #### * 一.函数模板 * * 1.简单使用 * 2.模板原理 * 3.函数模板的实例化 * 4.模板参数的匹配原则 * 二.类模板 * * 1.基本格式 * 2.类模板实例化 ## 一.函数模板 ## ### 1.简单使用 ### > **函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。** > **template<typename T1, typename T2,…,typename Tn> > 返回值类型 函数名(参数列表)\{\}** *例如一个交换函数* ![在这里插入图片描述][9832825dc36549baac67d941d5f6ef67.png] ![在这里插入图片描述][de2a68baa0144fc7b615a7e94f4d8ede.png] > **这里a,b和c,d的类型不同,如果是c语言的话,我们必须写一个int类型的交换和一个double类型的交换,很麻烦。但是有模板的话,就可以借助编译器自动推演类型。** ### 2.模板原理 ### > **函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。** ![在这里插入图片描述][0676d5ed1bd14524b30aba221a14abed.png] > **在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。** ### 3.函数模板的实例化 ### *例子* ![在这里插入图片描述][6272e6fc851d4a44ae7cc59d60ba858f.png] > **两个传参不同时在怎么办呢?该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或double类型而报错注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题编译器就需要背黑锅** ![在这里插入图片描述][d85d90282f464aaaaf1bbe80400a5466.png] ### 4.模板参数的匹配原则 ### **1.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。** ![在这里插入图片描述][8135f85e95d642d695b2df21c245b95f.png] **2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。** ![在这里插入图片描述][8586539bb3b7462a962c1d1816c1df5b.png] **3. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。** ## 二.类模板 ## ### 1.基本格式 ### ![在这里插入图片描述][18ab3c30031d4b4c8728884d7c9eca64.png] ![在这里插入图片描述][da04a77fd6a14bd4a4110344538d1ac2.png] ### 2.类模板实例化 ### > **类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。** ![在这里插入图片描述][c49540c960bb40dfb6d36328c04de35e.png] [9832825dc36549baac67d941d5f6ef67.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/18/5ff91bc02b054b089aa2454f84c67155.png [de2a68baa0144fc7b615a7e94f4d8ede.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/18/538a9cf90bf64752a7f4697dac282cc3.png [0676d5ed1bd14524b30aba221a14abed.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/18/25b227ef4c2a443982011dc4e02006f6.png [6272e6fc851d4a44ae7cc59d60ba858f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/18/600978446fd647d28614e8a191a4f556.png [d85d90282f464aaaaf1bbe80400a5466.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/18/e79e8a5d92924cbea1286847c40fcac8.png [8135f85e95d642d695b2df21c245b95f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/18/064249c43a77496fae1bbfa2f2edd08d.png [8586539bb3b7462a962c1d1816c1df5b.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/18/ec8213757a044b489c4795fbb1084cd2.png [18ab3c30031d4b4c8728884d7c9eca64.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/18/94699f4088b84b8bb49247a01933a2dc.png [da04a77fd6a14bd4a4110344538d1ac2.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/18/51961a5cb83244c488d26bdf7f8b790e.png [c49540c960bb40dfb6d36328c04de35e.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/18/a65ed9676e474f3f9bbd321b915e640d.png
相关 C++初阶 入门 *目录** C++关键字(C++98) 命名空间 C++输入输出 缺省参数 函数重载 引用 内联函数 auto关键字(C++11) 基于范围的for循环... 淡淡的烟草味﹌/ 2024年04月17日 20:08/ 0 赞/ 40 阅读
相关 c++模板初阶 前言 在我们学习c语言中,我们发现很多逻辑一样但函数的数据类型不一样,我们都需重新写,这样就有点代码冗余了。当来到了c++就可以很好的解决这一问题,运用模板。这个模板其实 逃离我推掉我的手/ 2024年04月01日 17:47/ 0 赞/ 44 阅读
相关 【C++初阶】函数模板与类模板 文章目录 引言.泛型编程 一.函数模板 1.基本使用 2.拔高训练 2-1自动推演实例化和显式实例化 忘是亡心i/ 2024年04月01日 15:11/ 0 赞/ 33 阅读
相关 【C++初阶】:模板初阶 模板初阶 一.函数模板 1.简单使用 2.模板原理 3.函数模板的实例化 4.模板参数的匹配原则 二.类 短命女/ 2024年03月22日 19:12/ 0 赞/ 40 阅读
相关 【C++初阶】:模板进阶 模板进阶 一.非类型模板参数 二.模板的特化 1.概念 2.函数模板特化 3.类的特化 1.全特化 雨点打透心脏的1/2处/ 2024年03月18日 00:20/ 0 赞/ 67 阅读
相关 模板初阶 一、泛型编程 1、函数重载的缺点: (1)重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数 (2)代码的可维护性比较低,一个 拼搏现实的明天。/ 2022年03月21日 04:30/ 0 赞/ 159 阅读
相关 【C++】模板初阶 文章目录 一、泛型编程 二、函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的实例化 三、类模板 本是古典 何须时尚/ 2021年09月09日 03:40/ 0 赞/ 313 阅读
还没有评论,来说两句吧...