新闻详情

新闻详情

首页 / 资讯中心 / 详情

【纯干货】C++ 模板核心知识点 ——包含 面试高频坑(类型推导 / 实例化 / 分离编译)

发布时间:2026/9/30 7:06:17来源:尧图网络
【纯干货】C++ 模板核心知识点 ——包含 面试高频坑(类型推导 / 实例化 / 分离编译)
模板初阶文章目录模板初阶1.模板有啥用2.概念‼️注意点3.模板有几种4.函数模板4.1创造格式4.2两种用法直接用隐式实例化坑点类型冲突解决方法特殊表明显式实例化必须用显式实例化的情况4.3特殊情况普通函数和 函数模板 同名强制使用模板5.类模板5.1格式5.2成员函数的类外定义5.3使用实例化1.模板有啥用// 交换intvoidSwap(intleft,intright){inttempleft;leftright;righttemp;}// 交换doublevoidSwap(doubleleft,doubleright){doubletempleft;leftright;righttemp;}// 交换charvoidSwap(charleft,charright){chartempleft;leftright;righttemp;}有了模板可以让上面3个函数变成一个⬇️templateclassTvoidSwap(Tx,Ty){T tmpx;xy;ytmp;}2.概念函数模板在使用时编译器会根据你传入的类型自动生成对应类型的具体函数/类。两个细节定义模板参数用typename和class是完全一样的随便用哪个都行不能用struct代替class/typename‼️注意点模版不建议声明和定义分离到.h 和.cpp 两个文件会出现链接错误 实现Stack和list这种的时候3.模板有几种函数模版类模版4.函数模板4.1创造格式templateclass类型参数1,class类型参数2,...返回值类型 模板名(形参表){函数体}举例templateclassTvoidSwap(Tt1,Tt2){T tmpx;xy;ytmp;}4.2两种用法直接用隐式实例化inta110,a220;doubled110.1,d220.2;Add(a1,a2);// 编译器自动推导T为intAdd(d1,d2);// 编译器自动推导T为double坑点类型冲突Add(a1, d1); // 编译报错a1 是 int d1 是 double解决方法强转Add(a1, (int)d1); // 把double转成int或者Add((double)a1, d1); // 把int转成double显示实例化⬇️特殊表明显式实例化Addint(a1,d1);// 强制T为intAdddouble(a1,d1);// 强制T为double必须用显式实例化的情况当编译器无法推导出模板参数类型时必须用templateclassTT*func1(intn){returnnewT[n];}intmain(){double*p1func1double(10);//当编译器无法推导出模板参数类型时必须用显式实例化return0;}4.3特殊情况普通函数和 函数模板 同名templateclassTTAdd(constTleft,constTright){return(leftright);}intAdd(constintleft,constintright){return(leftright)*10;}intmain(){inta110,a220;coutAdd(a1,a2)endl;// 输出300调用的是普通函数return0;}输出300调用的是普通函数强制使用模板Addint(a1,a2);// 强制调用模板版本输出305.类模板5.1格式templateclassT1,classT2,...,classTnclass类模板名{类内成员定义}举例只是在类前面加了templatetypename T然后把所有用到 int 的地方都换成了 T。templatetypenameTclassStack{public:Stack(intn4):_array(newT[n]),_size(0),_capacity(n){}~Stack(){delete[]_array;_arraynullptr;_size_capacity0;}voidPush(constTx);private:T*_array;size_t _capacity;size_t _size;};5.2成员函数的类外定义templateclassTvoidStackT::Push(constTx){if(_size_capacity){T*tmpnewT[_capacity*2];memcpy(tmp,_array,sizeof(T)*_size);delete[]_array;_arraytmp;_capacity*2;}_array[_size]x;}必须再写一遍templateclass T函数名前面要写成StackT::Push而不是Stack::Push‼️5.3使用实例化只有显示实例化。实例化的结果才是真正的类 Stackdouble* p1和Stackint* p2是两个不同的类类型‼️intmain(){// Stack st1;// 错误Stack是类模板不是真正的类// 正确必须在尖括号里指定类型Stackintst1;// 存int的栈st1.Push(3);Stackdoublest2;// 存double的栈st2.Push(1.1);//new的方式Stackdouble*pstnewStackdouble;deletepst;return0;}
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

fish shell 的 for 循环:语法、变量作用域与实现原理全解析 2026/9/30 7:06:12

fish shell 的 for 循环:语法、变量作用域与实现原理全解析

CLI开发工具 【免费下载链接】fish-shell The user-friendly command line shell. 项目地址: https://gitcode.com/GitHub_Trending/fi/fish-shell 点击查看 免费下载 导读 for 是 fish shell 中最常用的循环结构,用于对一组值反复执行同一段命令。本文…

阅读更多 →
线程与内存模型:volatile 为什么对多线程没用 2026/9/30 7:06:12

线程与内存模型:volatile 为什么对多线程没用

① 钩子:三条一模一样的 movl 同一段"读一个 int"的代码,volatile、普通变量、std::atomic 编译出来一模一样——都是 movl (%rcx), %eax 一条指令。 那为什么 volatile 对多线程没用? 因为单条读是原子指令,但"读…

阅读更多 →
ERPNext 付款方式主数据(Mode of Payment)完全指南:字段配置、账户映射与 POS 集成原理 2026/9/30 7:06:12

ERPNext 付款方式主数据(Mode of Payment)完全指南:字段配置、账户映射与 POS 集成原理

后端企业应用 【免费下载链接】erpnext Free and Open Source Enterprise Resource Planning (ERP) 项目地址: https://gitcode.com/GitHub_Trending/er/erpnext 点击查看 免费下载 Mode of Payment(付款方式)是 ERPNext 中用于统管"客…

阅读更多 →
Python后端AI专题32:建立第一套 RAG 评测集:问题、证据与不可回答样本 2026/9/30 7:06:05

Python后端AI专题32:建立第一套 RAG 评测集:问题、证据与不可回答样本

Python后端AI专题32:建立第一套 RAG 评测集:问题、证据与不可回答样本没有固定评测集,“换模型后感觉更聪明”无法复核;只收集能回答的问题,又会把胡编但流畅的模型选上去。评测数据至少要同时表达:用户问题…

阅读更多 →
【HarmonyOS 7新能力|073】Taihe IPC异常排查:定位配置、权限与运行期失败 2026/9/30 7:05:59

【HarmonyOS 7新能力|073】Taihe IPC异常排查:定位配置、权限与运行期失败

【HarmonyOS 7新能力|073】Taihe IPC异常排查:定位配置、权限与运行期失败 实际项目里,自动生成IPC通信代码最难处理的并不是把一次调用跑通,而是在系统推断、跨进程连接、焦点变化或文件生命周期变化后仍保持结果可信。本文围绕 …

阅读更多 →
Flink 优化之 CheckPoint 优化及参数详解:从原理到生产环境调优的完整指南 2026/9/30 7:05:52

Flink 优化之 CheckPoint 优化及参数详解:从原理到生产环境调优的完整指南

前面讲了 Flink CheckPoint 的原理、参数设置、企业级案例,这些都是 CheckPoint 的基础。但在真实的生产环境中,CheckPoint 相关的问题是 Flink 作业最常见的故障来源——Checkpoint 超时、Checkpoint 失败、状态持续增长、反压导致 Checkpoint 慢、故障…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉