C 中的类模板详细讲述_第1页
C 中的类模板详细讲述_第2页
C 中的类模板详细讲述_第3页
C 中的类模板详细讲述_第4页
C 中的类模板详细讲述_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C中的类模板具体讲解并描述

一、11.1te23cl45//67)其中可以构成例:

1te23//45cl注意⑴如⑵模(3)(4)在lt23t、

类模板定义一个类emplateclalass类名{/类定义..;中,

template以是类型参数,成。

非类型参数emplatecla/type为类型lassGraphi意:

*

假如在全局域模板参数名不同一个模板参在不同的类模

typedefstrtemplatecl板定义及类模板:

ass模板参数.・・.是声明类模板,也可以是非数由一个一般

参asstype,in型参数,widthics;域中声明白与模不能被当作类模

参数名在模板参模板或声明中,ringtype;lasstype,i实例化数

表板的关键字,表非类型参数。

类参数构成,代ntwidthh为非类型参数模板参数同名模板定义

中类参数表中只能模板参数名intwidth表示声明一个类型参数由关

键代表模板定义中数的变量,则该成员的名字。

出现一次。

可以被重复使个模板,模板参键字class或中的一个常量该变

量被隐藏掉运用。

参数可以是一个typename及。

掉。

个,也可以是多及其后面的标多个,标识符45c67{8

9tlO11tl213}1415tl617cl819t2021c(5)在1

/23t45t67/89tlO11c(6)类class

Graph{typenode;/typedefdou);templateciclass

Rect;templateciclassRound在类模板的前〃全部三个Itemplate

ctemplatec//模板的真止templatecclassImage类模板参数可

hies//node不是subletype;/lasstype,c;lasstyped;前向

声明和定义Image声明都classTclclassUcl正定义classTypee

{〃模板定可以有缺省实参string类型〃错误:

成员classtype〃参数名ty义中,模板参都引用同一个类lass

Image;lassImage;定义中只能引用参,给参数供应员名不能与模板

〃错误:

重复ype在不同模数的名字可以类模板的声明;;用名字Type

供缺省实参的板参数type同复运用名为ty模板间可以重复以不

同。

,不能引用名字的依次是先右后名ype的参数复运用字T和U

后左。

};1te23cl45te67cl(7)类时,1t23c4

5{67G89}1011tl213vl415{1617G1819}

2.emplatecllassImage;emplatecllassImage类模板名可以必

需指定完整templateciclassGraph{Graphics*n};templateevoid

show(G(Graphicsty)类模板实定义:

从lasstype,;lasstype=d;以被用作一个类整的实参表

lasstypehiesnext;〃在类calsstypeGraphicstyype*pg二g实例

化从通用的类模板intsize二double,int类型指示符。

模板自己的定ypeg)g;〃必需指定板定义中生成=1024tsize

当一个类模板义中不需指定定完整的模板参成类的过程称为板名

被用作另肯定完整模板参数参数表为模板实例化。

一个模板定义数表。

中的类型指示符类模①当②对③一例:1t23c45

v67c89(101112131415}1617il819例:

Gra模板什么时候会当运用了类模板对象类型是一个一个指针或

弓I用templateciclassGraphvoidfl(GraclassRect{Graphics

Graphics}intmain(){Graphcisaphicsint会被实例化呢?板实例

的名字,个类模板实例,用指向一个类模lassTypehics(};

aphiescharsdoublesintsi;{schar*sgi;?,并且上下文,当

对象被定模板实例,当r);//仅是一rsd;〃声明〃si是一个c;〃

仅声明一文环境要求存在定义时。

此点被当检查这个指针一个函数声明明一个类模板引个

Graphics类一个类模板指在类的定义时被称作类的实例针或引用

所指的,不需实例化引用,不需实例类型的对象,需针,不需实例。

例化点。

的对象时。

例化须要实例化类模化模板20212223Grap2425}

3,非非要点①绑②从整值③可例:1T23T45c67

G89GIO11cl213R1415ul617Rconsl819Ifl(*sc)

intiobphicsstrin)非类型参数点点:

绑定给非类型参从模板实参到非值转换。

可以被用于非类TemplateinTcmplateclconstint

sGraphicssGraphicsOconstdoublRectdoubleunsigned

inRectStringst就正确。

Intarr[10];//须要实例化j=sizeof(Gng对象的大小数的模

板实参参数的表达式必非类型模板参数类型模板参数的nt*ptr

cllassType,isize=1024;sizebpl;/bp2;〃错误ledb=3.141e,db

fal;/ntfasize=2g,fasize];化,因为传递给raphicsst小,为了

计算大参参必需是一个常数的类型之间的模板实参的lass

Graphiintsizec/7错误:从co误不能通过隐式15;//错误:

不能255;fa2;〃错误给函数fl的是ring);〃需大小,编译器

必常量表达式。

间允许进行一些的种类有一些限ics{.};classRect{onstint*

一式转换把。转换能将constdo:

非类型参数是一个Graphi须要实例化,因必需依据类模板些转

换。

包括左限制。

int*是错误换成指针值ouble转换成的实参必需是

csint对象因为sizeof会板定义产生该类左值转换、限定的。

int.常量表达式,象。

会计算类型。

定修饰转换、提将unsigned提升、d改为2021G二、

要点①类成员②类地址lt23C45G67v89}10

11tl213v三、类模11.非非1c2Graphicsar、类模

板点:

*

类模板的成员函员函数定义前面类模板成员函数址,才被实例

化templateclClassGraphGraphics(){voidout();};

templatecivoidGraphic类模板模板中可以有三非模板友元

classGraphrrgp;〃正板的成员函数可以在类模面必需加上te数

本身也是一个化。

lasstypehies{{}〃成员函数;lasstype/icstype:板的友

元三种友元声明:

元类或友元hies{void。正确函数模板的定义中emplate及

模个模板,类模数定义在类模板〃成员函数定:。a(){}声明:

函数out();};中定义(inline模板参数)。

模板被实例化时板的定义中定义在类模板定函数),也可以时

它并不自动被定义之外以在类模板定被实例化,只有定义之外定义

(此有当它被调用此时用或取3T45C67f89f1011fl2

13}2、、3、、其次如图第三如图例:

TemplateclClassRect(friendclasfriendvoidfriendvoid);

绑定的友元非绑定的友二种声明表示类图:

三种声明表示类图:

绑定的友元模lassT{ssGraphicsdcreate();dGraphics

元类模板或友元类模板类模板的实例和类模板的实例和模板

s;〃类Graph;//create::out();//或函数模板。

板或函数模板和它的友元之和它的友元之hies、函数、out是

类模Rect全部实。

板。

O

之间是一种一对之间是一种一对模板实例的友元对一的映射

关系对多的映射关系系。

系。

1t23v45t67c89flO11}例:

1te23c145te67fr89};注意成员也必例:

1t23c45p67ftemplateclvoid

createtemplateclclassGraphfriendvoid);非绑定的友元

emplateclalassGraphiemp1atec1ariendvoid;意:

当把非模板员声明为类模板必需先声明。

templatecclassA{private:friendclaslasstype

e(Graphicslasstypehies{dcreatety元模板asstypeics{ass

Tcreate(Gra板类或函数声明板友元,该类必classTssBT;//type);

ype(GraphiaphicsT);明为类模板友必需已经被定/错误:

类B必icstype);;友元时,它们不定义,另外在声必需先声明;

不必在全局域中声明绑定的友元中被声明或定元类模板或函义,但将

一个数模板时,该个类的该模板89}1011tl213c四、1

1.类类要点①静②类内存③当员的例:

1t23c45s67s89}1011tl213G14

15t1617tl8};templatecclassB{};类模板类模板的静

八占、、•

静态数据成员的类模板静态数据存。

当程序运用静态的实例引用要通templateclclass

GraphstaticGrapstaticcons};

templateclGraphicstytemplatecitypeGraphiclassT板的静态静

态数据成的模板定义必需据成员本身就是态数据成员时,通过一个类

模板lasstypehies{phics*nextsttypeitelasstypeype*

Graplasstypeicstype:数据成员员员须出现在类模是一个模

板,,它被实例化板实例。

t;em;phicstype:item=NULL;、嵌套模板定义之外。

它的定义不会化,每个静态成::noxt=0;;套类型会引起内存

被分成员实例都与一安排,只有对其一个类模板实其实例化才会例相

对应,静会安排静态成19/如Gr2.类类要点①在数。

②当实例③公例:it23c45p67t89clO

11)1213G1415/五、定义要点〃静态成员定raphicstyp

类模板的嵌点:

在类模板中允许当外围类模板被例化。

公有嵌套类型可templateciclassGraphpublic:

templateciclassRect{};Graphicsin〃引用公有嵌、成员模义:

成员定义前点:

*

定义分为两部分pe::next=O嵌套类型许再嵌入模板,被实例

化时,它可以被用在类定lasstypehies{lassT{void

out(tnt::Rectd嵌套类型必需加模板板前上加上temp分:

前一部分是0;,因此类模板它不会自动被定义之外,这typea,T

b)doublenod加上类模板实例late及模板参是类型,比如G板的

嵌套类也是被实例化,只有这时它的名字前);};de;例名字参数

表。

raphicsty是一个模板,它有当上下文须要前必需加上类模pe*,

后一部它可以运用外要它的完整类模板实例的名部分是名称和值围

类模板的模类类型时,它才名字。

值,比模板参才会被①在多个②只③成例:1t23c4

5p67c89tlO11v之外1213G1415G1617G留

意六、1.包包这种中,件中2.分分在一个类模板中个成员函

数.只有当成员模板成员模板可以定templateciclass

Graphpublic:tempclassRect{templatecivoidGraphi(要根上完整

模GraphicsinGraphicsinGraphicsin意:

类模板参数、类模板包含编译模种编译模式下,假如一个成

员中。

分离编译模中定义一个成员板被运用时.,它定义在其外围类

lasstypehicstype{plateclass{voidout(tlassGtypeicsGtype:

模板实参)nt的实例可能nt::Rectdnt::Rects数不肯定与类模板的

编译模式式类模板的成员员函数被定义在模式式员模板,意味着

它才被实例化类或类模板定{sTtypea,Tb)template::RectTT:

能包括下列嵌套doublestring模板定义中指模式式员函数和静

态在类模板定义着该类模板的一化.定义之外.);};};class

TT::out(Gtype套类型:

指定的名字相同态成员的定义必义之外,那么这一个实例包含e

a,TTb){}同。

必需被包含在这些定义应当被含了可能无限多〃成员模板被要

将它们实例被放在含有该类多个嵌套类和无被定义在类模板例化的

全部文类模板定义的无限板定义文件的头文这种据成例:

1/23e45C67{89/1011#1213T14

15V1617/1819#2021V2223{2425T2627/2829P30

31}SetuGra数实tem种模式下,类模成员被放在程序

//------GraexporttempClassGraph{void

Setup//-------Gr#includeGTemplateeVoid

Graphi//------use#includeGVoidmain(){Graphicsilnt

ival=l;//GraphicsPg-Setup(i}up的成员定义phicsint:实例或

静态数据mplate前加关模板定义和其序文本文件中。

aphics.h--plateclasshicsp(ccnst

typraphics.c--Graphics,hclasstypeicstype:er.c----

Graphics,h)int*pg=ne;int::Setuival);义在User,c

中::Setup(con据成员实例被使关字键字expoinline成员函。

-stypepe);};------------:Setup(consew

Graphicsup(constin中不行见,但在nstint)。

为使用时,编译ort函数定义被放在-sttype)sint;nt)

的实例在这个文件中仍为实现这一点译器只要求模板在头文件中,

{}(下有注解)仍可调用模板,须将类模声板的定义,它而非inline

成实例声明为可导出的的声明方式是成员函数和静态的:

当它的成是在关键字态数员函33.显显当使译器例声例:

1#i23Te显式七、1.类类先看1Te23C145Pu6

7Cl假如函数为此格式下面注意显式实例声运用包含编译模

器实例化类模板声明:

关键字tincludeGremplatecla式实例化类模板、类模板

类模板的特看下面的例子:

emplateclalassGraphiublic:voidlassRect{果模板实参是R

数out(),我们此,我们可以通式:

template面为类模板实例Templat意:

声明明模式时,类模板板成员的定义,template后面

raphics.hassGraphic板时,它的所有板的特化特化化ass

typeics{out(typef);Rect类型,我们希望特地定义通过一个显

小特e成员函例GraphicstevoidG板成员的定义,我们并不能面

跟着关键字csint;〃显有成员也被显及部分特figure”}}我们

不希望运用义Graphics特化定义,为数特化定义Rect的成员

GraphicsRe义被包含在运用能精确地知晓,字class以及类显式实

例声明显式实例化。

特化化);用类模板GraRect::out为类模板实例的员函数

out()定ect::out(R用其实例的全部为解决这个类模板实例的名

aphics的通用t()实例,让它的一个成员供应定义了显式特Rect

figure){有程序文本文问题,标准C名字。

用成员函数定义它运用Rect里供一个特化定特化:

{)文件中,何时何C++供应了显义,来实例化里面的成员函定

义。

何地编显式实化成员数。

①只②若板特③类特化2.类类假如类模模板例:

1te23C145Te67Cl格式注意①部②类化,它即

实例③类八、类模只有当通用类模若定义了一个类特化的成员定

义类模板不能够在化。

类模板部分果模板有一个以模板,而不是为板,只不过某些

emplateintlassGraphiemplateintlassGraphi式:

template意:

*

部分特化的模板类模板部分特化当没有特化可例:

Gra即能从通用类模例化模板。

类模板部分特化、名字空模板定义也可以模板被声明后,类

模板特化,则义不能以符号在某些文件中根分特化以上的模板参数

为全部的模板参些模板参数已经thi,intwiics{};thi〃类模

icshi,90{e模板参数表板参数表只列出化是被隐式实例可被运用

时,,才aphics24,9模板定义被实例化必需有它自己空间和类以被放

在名字空,它的显式特则必需定义与template依据通用模板数,则

有些人就参数特化该类经被实际的类型id模板的部分特化。;表

表出模板实参仍例化的。

编译才运用通用模0figure;例化,也能从己对成员函数模板板

空间中。

例如特化才可以被定这个特化相关作为打头。

(板定义被实例化就可能希望为类模板。

即,希型或值取代。

化仍旧未知的那些译器选择针对模板定义。

从部分特化的定数、静态数据成如:

定义。

关的全部成员函(template化,而在其他文为一个特定的模希望

供应这样一通过运用类模些参数。

该实例而言最定义被实例化,成员和嵌套类的函数或静态数被

省略)文件中却针对模板实参或者一一个模板:

它仍模板部分特化,最为特化的模板但编译器选择的定义。

数据成员,此时同一组模板实一组模板实参仍旧是一个通,可

以实现这一板定义进行实择的是部分特时类模实参被参特化通用的

一点。

实例特化来1N23T45C67T89T1011{12

13)当类或者1Vo23{45us67Gr89)注意类模化)

一个12NamespacecTemplateclClassGraphTemplateclType

create{}}类模板名字Gr者通过一个usioidmain()sing

cpluspraphicsint意:

在名字空间模板成员的特化。

个关于队列的例#1_慎111(16cplusplus_plasstypehies{};

lasstypee()aphics被用在ing声明或指plus_primert*pg=new

间中声明类模板化声明必需被声例子,下面将其

iostream.hprimcr{在名字空间之示符被引入。

r::GraphicsGraphicsi板也会影响该声明在定义通其代码整理

如h之外时,它必需例如:

s;int;该类模板及其成通用模板的名字如下:须被名字空间

名成员的特化和部字空间中(可名cplusplus_部分特化声明以在名

字空间_primer限定的方式,类模间之外定义模板定修,模板或板特

3templateclassTypeclassQueueitem;45templateclass

Type67classQueue{89public:1011friend

ostreamoperator(ostreamos,constQueuesTypeq);1213

Queue():front(0),back(0){}1415~Queue(){)16

17voidadd(constType);1819boolis_empty()const20

21{2223returnfront=0;2425)2627Type

remove();2829private:3031QueueltemType*front;

3233QueueltemType*back;3435);3637template

classType3839classQueueitem4041{4243

public:4445Queueitem(Typeval){item=val;next=0;}46

47friendclassQueueType;4849friendostream

operator(ostreamos,constQueueTypeq);5051friend

ostreamoperator(ostreamos,constQueueltemTypeqi);5253

5455private:5657Typeitem;5859Queueitem*next;

6061);6263templateclassType6465void

QueueType::add(constTypeval)6667(6869

QueueltemType*pt=ncwQueueltemType(val);7071if

(is_empty())7273front=back=pt;7475else76

77{7879back-next=pt;8081back二pt;8283)

8485}8687templateclassType8889Type

QueueType::remove()9091{9293if(is_empty())94

95{9697cerrremove()onemptyqueue\n;9899

exit(-1);100101)102103QueueltemType

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论