资讯动态

我的C++模板的学习总结

发布时间:2026/9/25 18:11:46 来源:尧图企业网站定制
模板总结文章目录模板总结1.形式注意点函数模板类模板2.实例化与使用注意点函数模板1.隐式实例化直接使用2.显示实例化类模板3.非类型模板参数常量作为模板参数注意点形式4.特化注意点分类1.全特化2.偏特化5.不支持分离编译6.题目1231.形式注意点class和typename可以混用函数模板类模板最开始加上了templateclass T1, class T2, ..., class Tn类内声明类外定义的函数开头也要加上templateclass T1, class T2, ..., class Tn并且要加上类域StackT::2.实例化与使用注意点函数模板可以和普通函数同名如果能直接用普通函数就不会使用函数模板来实例化除非强制显示实例化普通函数不合适的时候再用函数模板函数模板不允许自动类型转换如果函数模板里面只有一个class T那这时候传的两个参数必须是同一个类型的如果是不同的话函数模板应该是class T1,class T2但普通函数可以实例化后的结果才是真正的函数或者类函数模板1.隐式实例化直接使用inta110,a220;doubled110.0,d220.0;Add(a1,a2);Add(d1,d2);2.显示实例化Addint(a,b);类模板Stackintst1;3.非类型模板参数常量作为模板参数注意点只有整形可以可以只有数不赋值size_t N而N的值没定可以只有一个非类型模板参数没有其他的模板参数templatesize_t N变量不可以即使是整型变量(int x299) 都不可以因为它必须在编译期就确认一个数字形式namespacelcj{templateclassT,size_t N10classarray{T _array[N];};}intmain(){lcj::arrayint,5a;// 把 N 指定为 5这个对象占 5 个 intlcj::arrayint,100b;// 把 N 指定为 100这个对象占 100 个 intlcj::arraydoublec;// 不写就用默认的 10相当于 double _array[10];}4.特化注意点必须有一个基础的模板函数函数名后加上尖括号尖括号中是特化的类型函数形参表必须要和模板函数的基础类型完全相同分类1.全特化templateboolLessDate*(Date*left,Date*right){return*left*right;}templateclassDataint,char{public:Data(){coutDataint, charendl;}private:int_d1;char_d2;};2.偏特化// 将第二个参数特化为inttemplateclassT1classDataT1,int{public:Data(){coutDataT1, intendl;}private:T1 _d1;int_d2;};//两个参数偏特化为指针类型templatetypenameT1,typenameT2classDataT1*,T2*{public:Data(){coutDataT1*, T2*endl;}private:T1 _d1;T2 _d2;};//两个参数偏特化为引用类型templatetypenameT1,typenameT2classDataT1,T2{public:Data(constT1d1,constT2d2):_d1(d1),_d2(d2){coutDataT1, T2endl;}private:constT1_d1;constT2_d2;};5.不支持分离编译模板不支持分离编译所以不能在.h声明在.cpp实现一般只能放在一个文件里6.题目1下列的模板声明中其中几个是正确的 1)template2)templateT1,T23)templateclass T1,T24)templateclass T1,class T25)templatetypename T1,T26)templatetypename T1,typename T27)templateclass T1,typename T28)typename T1,class T29)templatetypename T1, typename T2, size_t N10)templatetypename T, size_t N100, class _Aalloc11)templatesize_t N正确的定义为4 6 7 9 10 11一共6个故答案为D2以下程序运行结果正确的是( )templateType Max(const Type a, const Type b){​ cout“This is Max”endl;​ return a b ? a : b;}templateint Max(const int a, const int b){​ cout“This is Max”endl;​ return a b ? a : b;}templatechar Max(const char a, const char b){​ cout“This is Max”endl;​ return a b ? a : b;}int Max(const int a, const int b){​ cout“This is Max”endl;​ return a b ? a : b;}int main(){​ Max(10,20);​ Max(12.34,23.45);​ Max(‘A’,‘B’);​ Max(20,30);​ return 0;}A.This is Max This is Max This is Max This is MaxB.This is Max This is Max This is Max This is MaxC.This is Max This is Max This is Max This is MaxD.This is Max This is Max This is Max This is Max答案为: A3以下程序运行结果正确的是( )templateclass T1, class T2class Data{public:Data() { cout “DataT1, T2” endl; }private:T1 _d1;T2 _d2;};templateclass DataT1, int{public:Data() { cout “DataT1, int” endl; }private:T1 _d1;int _d2;};template typename T1, typename T2class Data T1**,T2**{public:Data() { cout “DataT1**, T2**” endl; }private:T1 _d1;T2 _d2;};template typename T1, typename T2class Data T1, T2{public:Data(const T1 d1, const T2 d2)_d1(d1), _d2(d2){cout “DataT1, T2” endl;}private:const T1 _d1;const T2 _d2;};int main(){Datadouble, int d1;Dataint, double d2;Dataint, int d3;Dataint, int d4(1, 2);return 0;}A.DataT1, T2 DataT1, int DataT1*, T2* DataT1, T2B.DataT1, int DataT1, T2 DataT1, T2 DataT1*, T2*C.DataT1, int DataT1, T2 DataT1*, T2* DataT1, T2D.DataT1, T2 DataT1, T2 DataT1*, T2* DataT1, T2答案为: C

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑