尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

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

发布时间:2026/9/29 3:00:18

资讯中心
01
ARTICLE

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

【纯干货】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;}
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。