C++类模版

张开发
2026/5/22 12:13:02 15 分钟阅读
C++类模版
C类模版目录1. 前言2. 相关问题2.1 类模版和函数模版的区别2.2 类模版中成员函数的创建时机2.3 类模版对象做函数参数2.4 类模版与继承2.5 类模版与友元3. 总结1. 前言1.1 C另一种编程思想称为泛型编程后面还有模块化编程和现代C本阶段主要针对C泛型编程做详细讲解其中主要利用的技术就是模板探讨C更深层的使用1.2 模板就是建立通用的模具大大提高复用性模板的特点模板不可以直接使用它只是一个框架模板的通用并不是万能的1.3 C提供两种模板机制函数模板和类模板。我们今天学习后者类模板和函数模板语法相似在声明模板template后面加类此类称为类模板2. 相关问题2.1 类模版和函数模版的区别类模板与函数模板区别主要有两点类模板没有自动类型推导的使用方式,代码如下#includeiostreamusingnamespacestd;#includestringtemplateclassNametype,classAgetypeclassPerson{public:Person(Nametype name,Agetype age){m_Namename;m_Ageage;}voidshowPerson(){coutname:m_Name age:m_Ageendl;}Nametype m_Name;Agetype m_Age;};intmain(){Personstring,intp(孙猴子,16);p.showPerson();system(pause);return0;}//构造函数和成员函数类外实现如下#includeiostreamusingnamespacestd;#includestringtemplateclassNametype,classAgetypeclassPerson{public:Person(Nametype name,Agetype age);voidshowPerson();Nametype m_Name;Agetype m_Age;};templateclassNametype,classAgetype//给出模版PersonNametype,Agetype::Person(Nametype name,Agetype age)//给出作用域{m_Namename;m_Ageage;}templateclassNametype,classAgetypevoidPersonNametype,Agetype::showPerson(){coutname:m_Name age:m_Ageendl;}intmain(){Personstring,intp(孙猴子,16);p.showPerson();system(pause);return0;}类模板在模板参数列表中可以有默认参数代码如下#includeiostreamusingnamespacestd;#includestringtemplateclassNametype,classAgetypeintclassPerson{public:Person(Nametype name,Agetype age){m_Namename;m_Ageage;}voidshowPerson(){coutname:m_Name age:m_Ageendl;}Nametype m_Name;Agetype m_Age;};intmain(){Personstringp(孙猴子,16);p.showPerson();system(pause);return0;}2.2 类模版中成员函数的创建时机我们已知普通类里面的成员函数一开始就可以创建类模板中成员函数是在调用时才创建当然编译器也会对此有影响#includeiostreamusingnamespacestd;classPerson1{public:voidPrint1(){coutPerson1的调用endl;}};classPerson2{public:voidPrint2(){coutperson2的调用endl;}};templatetypenameTclassPerson{public:T obj;voidfun1(){obj.Print1();}voidfun2(){obj.Print2();}};intmain(){PersonPerson1p;p.fun1();p.func2();system(pause);return0;}此时编译成功没有去调用这两个函数就不会报错。运行时才报错修改需要注释p.fun2()结论就是类模版中的成员函数在调用时才能创建2.3 类模版对象做函数参数给出最常用的一种 传入指定类型的写法否则就需要函数模版和类模版配合来传参代码如下#includeiostreamusingnamespacestd;#includestringtemplateclassnametype,classagetypeclassPerson{public:Person(nametype name,agetype age){m_Namename;m_Ageage;}nametype m_Name;agetype m_Age;};voidPersonprint(Personstring,intp)//传入指定类型{coutname:p.m_Name age:p.m_Ageendl;}intmain(){Personstring,intp(shun ,19);Personprint(p);system(pause);return0;}2.4 类模版与继承2.4.1 当子类继承的父类是一个类模板时子类在声明的时候要指定出父类中T的类型如果不指定编译器无法给子类分配内存#includeiostreamusingnamespacestd;templatetypenameTclassBase{};classSon:publicBaseint{};voidtest(){Son s1;}intmain(){test();system(pause);return0;}2.4.2 如果想灵活指定出父类中T的类型子类也需变为类模板代码如下:#includeiostreamusingnamespacestd;templatetypenameTclassBase{};templatetypenameT1,typenameT2classSon:publicBaseT2{};voidtest(){Sonint,chars1;}intmain(){test();system(pause);return0;}2.5 类模版与友元给出常用的一种实现方式全局函数在类内实现直接在类内声明友元去全局函数在类外实现的不常用也麻烦不给出代码如下#includeiostreamusingnamespacestd;//#includestringtemplateclassNametype,classAgetypeclassPerson{friendvoidshowPerson(PersonNametype,Agetypep){coutname:p.m_Name age:p.m_Ageendl;}public:Person(Nametype name,Agetype age){m_Namename;m_Ageage;}private:Nametype m_Name;Agetype m_Age;};intmain(){Personstring,intp(孙猴子,16);showPerson(p);system(pause);return0;}3. 总结类模板就是通用类的模具使用时必须指定具体类型。它不能自动推导类型但可以给模板参数设默认值。成员函数调用时才创建继承时要指明父类类型。传参常用指定类型方式友元函数直接在类内实现最方便。另外如果上述有任何问题请大家指教不过没关系主要是自己能坚持更希望有一起学习的同学可以帮我指正。

更多文章