




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、:数据类型型与语法作者:谢兴兴 HYPERLINK mailto:enigma19971 eenigmma199971hhotmaail.ccom 转转载需注明明出处Symbiian系统统已经提供供了一套已已经定义好好的内置的的数据类型型。为了保保证你的代代码是编译译器无关的的,应当使使用下面ssymbiian系统统提供的数数据类型,而而不要使用用原生数据据类型(nnativve tyypes,这里指标标准C中的的int ,chaar等)。基本类型TIntXX 和 TTUinttX (其其中X = 8, 16 和和 32) 分别用用来表示 8位, 16位 和 322位的有符符号和无符符号的整数
2、数。 一般般情况下,使使用TInnt 和TTUintt就可以了了,除非是是在考虑代代码优化或或兼容性的的时候,才才会用到TTInt88,TInnt16这这样的类型型。TInnt 或 TUinnt 类型型分别对应应有符号和和无符号的的整数。TInt664. 在在版本8.0之前,SSymbiian系统统中不支持持64位的的算术运算算,而是用用两个322位的值来来实现644位的整数数,在8.0版本之之后,TIInt644和TUIInt644才被定义义为lonng loong类型型,真正使使用64位位的内置数数据类型。TReall32 和和 TReeal644 (TRReal相相当于TRReal664
3、) 这这两个数据据类型相当当于单精度度和双精度度的浮点数数,由于浮浮点数的运运算要比整整数慢,所所以一般应应尽量避免免使用浮点点数的运算算。TTexttX (其其中X = 8 或或 16) 分分别对应窄窄或宽的字字符(注:所谓窄字字符通常AASCIII码字符,而而宽字符是是指uniicodee字符集的的字符 )TAny*TAny* 意为指指向任意内内容的指针针,在这种种意义上讲讲,TAnny相当于于voidd, TAAny* 相当于TTAny*。但是,在在某些场合合下,vooid标示示空,如:void helllo(vvoid);这时,不要要将它改写写为: TAnyy helllo(TTAny
4、);TBooll 标示布尔类类型。Syymbiaan系统提提供了两个个常量:EETruee (=11) 和 EFallse (=0),分分别表示真真和假。注意:在SSymbiian系统统中,TBBool被定定义为innt, 而而ETruue和EFFalsee被定义为为enumm,所以,如如果一个函函数的返回回值为TBBool,不不要用如下下的代码来来比较函数数的返回值值:TBooll isLLargeer(TIInt aa, TIInt bb)returrn (aab)?ETruue:EFFalsee; if(issLargger(44,3)=ETrrue). /错误误,编译不不过。if(is
5、sLargger(44,3). /正确确2类和对象象2.1 SSymbiian系统统中的命名名习惯:在Symbbian系系统中编写写代码时,应应当遵守种种样几个规规则:成员员变量的命命名以小写写字母i开开头,方法法的参数以以小写字母母a开头,例例如:classs Perrnonpubliic:TIntt iAgge;voidd SettAge(TIntt aAAge)iAgee = aaAge;在symbbian系系统中存在在几种不同同类型的类类(claass),不不同类型的的类,其特特性也各不不相同。有的在堆(hheap)上上创建,有有的在栈(sstackk)上创建建,特别的的是,类的的实例
6、(iinstaance)的的清除方式式也不尽相相同(下面面,为了方方便我们把把类的类别别称为型别别)。型别别(claass ttype)可可以体现这这些不同的的特点。每每个型别都都有一套定定义好的关关于如何创创建和清除除实例的规规则。为了了容易区分分型别,SSymbiian系统统使用了一一个简单的的命名规则则:类名以以大写字母母开头(TT,C,RR 或M)。作为类的的设计者,你你先要考虑虑这个类的的行为,看看它到底与与哪种型别别匹配,一一旦确定了了它的类型型,然后你你就可以专专注于该类类的功能。同样,对对一个类的的使用者来来讲,如果果他不熟悉悉这个类, 但类的命命名规则可可以帮助他他弄清你的的
7、意图-如何用安安全的方式式初始化、使用和销销毁一个类类的对象(oobjecct)。下面,我主主要讨论不不同型别的的主要特性性。T 类T类的行为为类似于CC+中的的内置类型型,因此,它它们以T作作前缀(”T”代表”Typee”)。象内内置类型一一样,它们们没有析构构方法(ddestrructoor),这这导致的结结果是:TT类不能包包含具有析析构方法的的成员变量量。所以,一一般情况下下,T类的的成员变量量只能是内内置类型的的数据或者者是其它的的T类的对对象。在某某些的情况况下T类也也可以包含含其它对象象的指针或或引用,不不过,这时时它们之前前是“使用”关系,而而不是“拥有”关系(也也就是说,这这
8、个T类对对象并不负负责对成员员的创建和和销毁的工工作)。不不能拥有外外部数据的的原因是因因为T类没没有析构方方法。正是是由于没有有析构方法法,T类的的对象可以以在栈上创创建,当程程序流程退退出函数或或产生leeave(一一种代码异异常)的时时候,系统统自动清除除它。即使使T类有一一个析构方方法,在发发生异常(在在Symbbian系系统中,异异常被称为为leavve)时SSymbiian 系系统也不会会调用它,因因为leaave没有有模仿标准准C+的的抛出异常常的做法。T类的对象象也可以在在堆上创建建。但是,应应当在调用用有可能发发生异常的的代码之前前,将这个个对象放入入到清除栈栈(cleean
9、uppStacck),在在发生异常常的时候,清除栈(cleanupStack)会释放这个对象。C 类这种类都是是从CBaase派生生来的(直直接或间接接)。/.h fileeclasss CStuudentt:publlic CBasse publlic:CStuudentt()RDeebug:Priint(_L(ii am a sttudennt);CSttudennt()RDeebug:Priint(_L(ppleasse, ddontt killl mee!);voidd SamppleFuunctiion();privvate:TIntt iCoode;TIntt iSccore;CB
10、asee有两个特特点:首先先,它有一一个虚的析析构方法,这这样,可以以通过CBBase指指针来删除除它的子类类。代码如如下所示:CBasee *pSStu = neww CSttudennt();delette pSStu;结果: i aam a studdent pleaase, dont kiill mme! 其次,CBBase类类和它的子子类,重载载了neww操作符,这这使得当它它在堆上创创建的时候候,自动初初始化为00,也就是是说,当它它一开始被被创建出来来的时候,所所有的成员员变量都被被初始化为为0,所以以您不必在在构造方法法中去做这这件事情。但是,在在栈上创建建对象时,情情况并非这
11、这样, 因因为这时没没有用到nnew操作作。这将潜潜在地导致致堆上创建建的对象和和栈上创建建的对象的的行为不一一致。因此此,C类的的对象一定定要在堆上上创建。很明显,当当一个堆上上的C类对对象不再被被需要时,我我们需要消消耗它。 一个C类类的对象可可能以两种种方式存在在:其它类类的指针成成员变量或或是一个局局部的针指指变量。在在前一种情情况下,我我们可以在在类的析构构方法中调调用dellete来来删除它;后一种情情况要复杂杂一些,在在调用任何何有潜在的的异常(lleavee)的代码码之前,要要把这个指指针放到清清除栈(ccleannup sstackk)中,否否则有可能能发生内存存泄露。CCB
12、asee 类声明明了私有的的拷贝构造造方法和赋赋值操作(=)。这是是一个很好好的策略,它它可以用来来防止客户户代码不小小心地使用用了浅拷贝贝或赋值的的方法。由由于基类的的拷贝构造造和赋值是是私有的,所所以,如果果您希望您您的类可以以能够使用用拷贝构造造方法,您您必须显式式地声明和和定义拷贝贝构造方法法和赋值操操作。但是是,考虑到到C类的特特性,深拷拷贝可能造造成发生异异常(leeave)的的隐患,而而您绝对不不能让类的的构造方法法(或析构构方法)发发生异常(我我们在本教教程的后面面解释原因因)。所以以,如果您您确实需要要一个拷贝贝的方法,那那么您可以以为类添加加一个的可可能会发生生异常的方方法
13、来完成成同样的任任务,例如如:ClooneL()或CoopyL()。如果果您提供的的这个类是是从CBaase派生生的,您就就不必为了了防止客户户代码使用用有潜在安安全问题的的“浅”拷贝,而而在代码中中将这些方方法声明为为私有的。R 类前缀“R” 在这里里代表资源源(Ressourcce), 通常是外外部资源,例例如:文件件的句柄(hhandlle)。 和C类不同同,Symmbiann系统中不不存在一个个对应的RRBasee类,所以以一个R类类应当有一一个构造方方法来将它它的资源句句柄置为00,表明还还没有资源源和这个新新建的对象象关联在一一起。但是是,不要在在构造方法法中初始化化资源句柄柄,因
14、为这这样有可能能使构造方方法产生异异常。R类类中常常有有类如Oppen(), Crreatee() 或或 Iniitiallize()这样的的方法,它它们用来分分配资源,设设置句柄成成员变量的的值,并返返回错误代代码或是产产生异常。 R类通通常也有对对应的Cllose()或或Reseet()类类,用来释释放资源,重重置句柄的的值-表表明没有资资源和该对对象关联。使用R类类时,一个个常见的错错误是忘记记调用它的的Closse()方方法(当然然,该方法法也可以是是其它名字字,但它经经常被命名名为Cloose()或或是有一个个析构方法法释放资源源,这会引引起资源的的泄露。R类通常都都很小,除除了资源
15、句句柄没有其其它的成员员变量。因因为不需要要。它通常常也没有析析构方法,资资源的释放放都是在CClosee()方法法中进行的的。大多数数情况下,RR类都是作作为类的成成员变量或或局部变量量存在的。只有少数数情况下,在在堆上创建建。您必须确保保,当程序序发后异常常的时候,资资源能被正正确地释放放-通常常是使用资资源栈。如如果一个RR类是一个个堆上的自自动变量(相相对于成员员变量),您您一但要保保证资源被被释放,而而且,变量量本身也要要被释放。typiccallyy by usinng twwo puush ccallss: ClleanuupCloosePuushL(), oor assimil
16、lar ffuncttion,to eensurre thhat tthe rresouurce is ccleanned uup, aand aa staandarrd ClleanuupStaack:PushhL(TAAny*) whiich ssimplly caalls Userr:Frree() on the heapp celll.R类的成员员变量通常常都很简单单,所以一一般不需要要深拷贝(bbitwiise ccopy)。R类的拷拷贝可能会会引起混乱乱(想象一一下:如果果两个对象象同时在一一个资源句句柄上调用用Closse()方方法,或两两个对象都都没有释放放资源,会会发生什么么
17、情况?)如如果,您想想阻止任何何对R类的的拷贝,您您应当声明明(但不定定义)一个个私有的构构造方法和和赋值操作作。M 类当提到多继继承的时候候,它意味味着从一个个主要的类类派生,同同时也混杂杂基它类的的功能。前前缀M是单单词Mixxin的首首字母。SSymbiian系统统不赞成多多继承的做做法,因为为这个引入入额外的复复杂性,MM类是一个个抽象类,它它的作用相相当于jaava中的的接口(iinterrfacee)。在SSymbiian系统统中,M 类常被用用来定义回回调接口或或者是观察察者(obbservver)类类。M类也也可以被其其它类继承承。下面我我们给出两两个例子。classs MAn
18、iimalpubllic:virttual voidd EatLL() =0;classs MDommestiicAniimal : puublicc MAniimalpubllic:virttual voidd NameeL() =0;classs CCatt : puublicc CBasse, pubblic MDommestiicAniimalpubllic:virttual voidd EatLL(); / 从MAniimal, 经过MDoomestticAnnimall继承virttual voidd NameeL(); / 从 MDoomestticAnnimall继承/ OOt
19、herr funnctioons oomittted ffor cclariity;上面的例子子演示了一一个从CBBase类类和一个MM类派生的的具体类。而类MDDomessticAAnimaal又是从从MAniimal派派生的。象象接口一样样,由于不不能被实例例化,M类类只能有虚虚(virrtuall)函数,不不能有成员员变量和构构造方法。但它可以以有析构方方法, 条条件是,实实现它的具具体类必须须是从CBBase派派生的。在在定义完类类以后,然然后可以用用使用它。代码如下下:CCat *cat11 = neww CCaat;delette ccat1; /正确然下面的代代码却是错错误的。M
20、Animmal *cat22 = neew CCCat;delette ccat1; /错误当用M类的的指针引用用一个对象象的时候,如如果用deeletee删除这个个指针,则则这个M类类必须提供供一个虚拟拟的析构方方法,否则则会出现系系统异常(ppanicc codde 422)。将MMAnimmal的代代码改写,则则上面代码码没有问题题。classs MAniimalpubllic:virttual voidd EatLL() =0;virttual MAnnimall(); /增加一一个虚的析析构方法。;3描述符(descriptor)在Symbbian 系统中,字字符串被称称为“描述符”
21、(desscripptor),因因为它们是是自我描述述的。在描描述符中保保存了它所所表示的字字符串的长长度和它的的底层的内内存布局的的信息。描描述符比标标准C中的的字符数组组和字符指指针要复杂杂,您可能能需要多花花些时间来来学习和掌掌握它的用用法。关键键是,它们们的特殊设设计使得它它们在少量量内存的设设备上非常常有效率,仅仅用非常少少的内存就就可以保存存自己的长长度和内存存布局的信信息。现在在,让我们们来深入了了解描述符符的设计思思想。在Symbbian系系统中,描描述符是相相当让人迷迷惑的,因因为它的种种类繁多。不同种类类的描述符符具有不同同的特性和和用法,但但又经常能能相互转换换。它们不不
22、同于标准准C+中中的strring,javaa语言中的的striing类或或MFC中中的CSttringg,因为程程序员必须须自己管理理底层的内内存分配和和清除工作作。它们具具有防治内内存溢出的的机制,并并且不依赖赖NULLL终结符号号来决定字字符串的长长度,从这这方而来讲讲,它也不不同于C语语言中的字字符串。现在我们来来讨论:什什么是描述述符?它们们是如何工工作的?在在探讨这些些不同的描描述符之前前,先让我我们需要弄弄清楚一个个基本的概概念:什么么是字符串串数据的“宽度”?这个长长度指的是是单个字符符是8biit的,还还是16bbit的宽宽度。在早早期的版本本中,字符符的宽度都都是8biit
23、的,后后来为了支支持Uniicodee字符集,从从第5版起起,Symmbiann系统将116bitt 的字符符作为标 准。Syymbiaan系统现现在支持这这两种字符符长度的描描述符,除除了Coppy()和和Sizee()两个个方法以外外,这两种种宽度的描描述符的行行为是完全全一致的,这这两个方法法的使用,我我们后面再再介绍。另另外,有一一套中立的的描述符类类型,它们们既可以被被定义为窄窄的描述符符类型,也也可以被定定义为宽的的描述符类类型,这要要取决于编编译时的宽宽度。您可可以从它的的名字上很很容易看出出这个类型型所表示的的宽度。假假如,它以以8结尾(例例如:TPPtr8,就就意味着它它表示
24、是的的8bitt的窄字符符,而以116结尾的的描述符类类(例如:TPtrr16)则则操作166bit的的宽字符。 对中立立(neuutrall)的类型型来讲,没没有数字结结尾(例如如:TPttr),在Symmbiann系统第55版以后,默默认的情况况下,它们们表示宽度度为16bbit的字字符串。它它们之间的的关系比较较类似于TTInt,TTInt116或TIInt322 之间的的关系,这这一点应当当是比较易易于理解的的。一般情况下下,您没有有必要指明明是字符串串的宽度,用用中立的类类型就可以以了,这样样使你的代代码易于在在宽字符版版本和窄字字符版本之之间转换(有有过编程经经验的朋友友应该有这这
25、样的印象象,我们平平常写代码码,大多情情况下,仅仅仅使用UUINT类类型,而较较少考虑使使用UINNT16,UUINT332类型)。另外一个问问题是:描描述符和字字面量(lliterral)的的区别。所所谓字面量量是指在编编码的时候候就已经确确定的量,例例如,标准准C中的 char* p = Heello worlld;其中的HHelloo worrld就就是字面量量。在Syymbiaan系统中中,对它们们的处理是是很不一样样的,这点点我们在后后面再介绍绍。有了这样的的一些认识识, 现在在我们可以以来看看有有哪些描述述符类型。在Symmbiann系统中描描述符类型型有两大种种类:不可可修改(n
26、non-mmodiffiablle)的描描述符和可可修改(mmodiffiablle)的描描述符。3.1不可可修改(nnon-mmodiffiablle)的描描述符 在Symbbian系系统中,所所有的描述述符都继承承自TDeesC,在在前面我们们已经讨论论了类名前前缀T所代代表的意义义,在这里里,我们更更关心类名名的后缀CC所代表的的意义,这这个C是单单词Connstannt的首字字符,表示示这个类是是不可更改改的。这个个类提供了了一些用来来返回字符符串的长度度和操作数数据的方法法。Lenngth()方方法返回了了描述符的的长度,因因为,每个个描述符对对象在内存存中的布局局都是同样样的,用4
27、4个字节来来表示它所所包含的数数据的长度度(实际上上,只用了了32个bbit中的的28个bbit,剩剩余的4bbit留作作它用,所所以描述符符能表示的的最大的长长度为2228 字字节,2556 MBB,不过这这已经足够够了)。所所以,Leengthh()方法法没有被它它的子类重重写,它对对所有子类类都有效。但是,根根据实现子子类的方法法的不同,子子类访问数数据的方式式也不一样样,Symmbiann系统不要要求它的子子类通过虚虚函数的方方式来实现现自己的访访问数据的的方法。 不用虚函函数重写的的原因是因因为,虚函函数会给每每个被派生生的描述符符对象增加加4节字的的额外负担担,c+用这4个个字节来
28、存存放指向虚虚函数表的的指针。我我们前面说说过,在设设计描述符符的时候要要让它尽可可能高效,额额外的字节节开销被认认为是不理理想的。存存放长度的的4个字节节中,288bit用用来表示长长度,剩下下的4biit用来表表示描述符符的类型。目前,ssymbiian系统统中有5种种派生的描描述符类型型,4biit限制了了描述符的的种类最多多只能有116种,但但这已经足足够了。子子类可以通通过调用基基类TDeesC的PPtr()方方法来访问问描述符的的数据,PPtr()方法检查查这4个bbit,确确定描述符符的类型并并返回它的的数据在内内存中的地地址。当然然,这要求求TDessC基类清清楚它的子子类的内
29、存存布局,并并在Ptrr()方法法中使用硬硬编码的方方法。后面面,为了表表述上的方方便,我们们也把这种种不可修改改的描述符符也称为常常量描述符符(connstannt deescriiptorr)总结:不可可修改的描描述符类TTDesCC是所有的的非字面量量描述符的的基类,它它提供了确确定描述符符长度和访访问数据的的方法,另另外,它实实现了所有有的您想用用来处理常常量字符串串的操作。3.2可修修改(moodifiiablee)的描述述符所有的可修修改的描述述符都从TTDes基基类派生,而而TDess本身又是是从TDeesC派生生的。TDDes有一一个额外的的成员变量量用来存放放为该描述述符分配
30、数数据的最大大长度。MMaxLeengthh()方法法返回了这这个最大的的长度。像像TDessC中的LLengtth()方方法一样,MMaxLeengthh()方法法也不被TTDes的的子类继承承。TDess类提供了了一系列的的方法, 用来对可可修改字符符串数据的的操作,包包括对字符符串的附加加、填充和和格式化操操作。所有有的这些方方法都被派派生类继承承,派生类类只实现一一些特定的的构造方法法和复制赋赋值的方法法。这些方方法都不负负责分配内内存,假如如它们超过过了描述符符的数据长长度,例如如,用Apppendd()方法法在某个字字符串后面面附加另一一个字符串串时,在调调用该方法法之前,您您必须
31、确保保有足够的的内存空间间。当然,只只要不超过过描述符的的最大存储储容量,描描述符的长长度可以自自由地伸缩缩。当描述述符长度比比最大长度度短的时候候,描述符符的后面部部分是多余余未用的。这些方法法使用了断断言(assserttion)来来确保描述述符的最大大长度不会会被超出。如果发生生内存溢出出,将会产产生一个ppanicc(关于ppanicc,我们将将在后面的的章节介绍绍),这样样可以方便便您检查和和修正程序序的错误。事实上,不不可能使描描述符溢出出,这一点点保证了您您代码的强强壮性,而而且不易产产生难以跟跟踪的内存存陷阱。但需要注意意的是,由由于基类的的构造方法法是prooteceed类型
32、的的,所以您您无法直接接实例化一一个TDeesC或TTDes类类的实例。现在我们们来看看描描述符的派派生类,您您可以实例例化和使用用派生类的的对象。正正如前面所所说,这个个地方是比比较让人迷迷惑的,因因为描述符符存在大量量的派生类类。 前面面,我们已已经解释过过为什么每每个类会有有三个不同同的版本,例例如:TDDes8, TDees16 和 TDDes,分分别对应窄窄字符,宽宽字符和中中立的类。现在,让让我们看看看有哪些主主要的描述述符类型,在在深入讨论论每种类型型的细节之之前,我们们先考察一一下它们在在一般情况况下的内存存布局。描描述符有两两种基本的的内存布局局:指针描描述符和缓缓存区描述述
33、符。不同同之处在于于,指针描描述符持有有一个指向向字符串的的指针,而而这个字符符串存储在在内存中的的基它位置置。与指针针描述符不不同,缓存存区描述符符本身持有有字符数据据,也就是是说字符数数据本身构构成了描述述符的一部部分。总结:TDDes 是是所有的可可修改的描描述符的基基类, 并并且它自己己也是从TTDesCC派生的。它有一个个能返回最最大的内存存容量的方方法和一系系列的用来来修改字符符串数据的的方法。3.3 指指针描述符符(poiinterr desscripptor)指针描述符符可分为两两种:TPPtrC 和TPtrr(我们前前面说过,每每种类型的的描述符,按按照字符宽宽度,都可可以分
34、为三三个版本,例例如:窄字字符版本TTPtrCC8,宽字字窄版本TTPtrCC16和中中立的版本本TPtrrC,所以以严格来讲讲,有六种种指针描述述符)。指指针描述符符所持有的的字符串是是跟描述符符本身分开开来存放的的,它可以以被存储在在ROM中中,堆中或或栈中。由由于保存数数据的内存存既不为描描述符所拥拥有,也不不通过它来来管理。所所以,如果果要该描述述符是在堆堆上分配的的,那么应应通过堆描描述符(HHBufCC,下面将将要讲解)来来操作内存存的分配和和销毁;如如果指针描描述符所指指向的字符符串是在栈栈上分配的的,那这个个内存必须须是已经在在栈上分配配好的。通通常情况下下,指针描描述符是基基
35、于栈的,但但有时候,它它们也可以以在堆上使使用,例如如:作为一一个CBaase派生生类的成员员变量的时时候。在不不可修改的的描述符(TTPtrCC)中,指指向数据的的指针存放放在长度的的后面,因因此,指针针描述符的的总长度为为2个字(wword);在可修改改的指针描描述符中,它它存放在最最大长度的的后面,因因此,总长长度为3个个字。下图图比较了TTPtr和和TPtrrC内存布布局.iLength(12)iMaxLengthiPtrHello world!iLength(12)iPtrTPtrCTPtr TPtrCCTPtrCC相当于CC语言中的的consst chhar*。被它指向向的数据可可
36、以被访问问但不能被被修改:也也就是说,描描述符中的的数据是常常量。所有有的从基类类TDessC中继承承的操作都都是可访问问的。TPPtrC定定义了一系系列的构造造方法,使使得它能从从其它的描描述符、指指向内存的的指针或以以0结尾的的C语言字字符串构造造。/ 字面面量描述符符将在后面面介绍_LIT(KLitterallDes, Siixty zipppers weree quiicklyy piccked fromm thee wovvenjute bag);TPtrCC panngrammPtr(KLitterallDes); / 从字面面量描述符符构造TPtrCC coppyPtrr(pan
37、ngrammPtr); / 从其它它的描述符符构造TBufCC coonstBBuffeer(KLLiterralDees); / 常常量缓存区区描述符,后后面介绍TPtrCC ptrr(connstBuufferr); / Coonstrructeed frrom aa TBuufC/ TTText88 is a siinglee (8-bit) chaaractter, equiivaleent tto unnsignned ccharconstt TTeext8* cSttringg = (TTexxt8*)Walltz, bad nympph, ffor qquickk jiggsve
38、x;/ 从以以0结尾的的字符串构构造TPtrCC8 annotheerPtrr(cSttringg);TUintt8* mmemorryLoccatioon; / Poointeer innto mmemorry innitiaalizeed ellsewhhereTInt lenggth; / LLengtth off memmory to bbe reepressenteed.TPtrCC8 meemPtrr(memmoryLLocattion,lenggth); / 从一个指指针构造。这个指针本本身可以改改变成指向向其他的字字符串数据据(通过SSet()方方法)。如如果您想指指明,不能能
39、改变您的的TPtrrC所指向向的数据,那那么您可以以将TPttrC声明明为connst,这这样,当您您试图用SSet()方方法更改TTPtrCC所指向的的数据时,编编译器会产产生警告。/ 字面面量描述符符_LIT(KLitterallDes11, SSixtyy zippperss werre quuicklly piickedd froom thhe wooven juteebag);_LIT(KLitterallDes22, WWaltzz, baad nyymph, forr quiick jjigs vex);TPtrCC alppha(KKLiteeralDDes1);TPtrCC
40、betta(KLLiterralDees2);alphaa.Sett(KLiiteraalDess2); / aalphaa poiints to tthe ddata in KKLiteeralDDes2beta.Set(KLitterallDes11); / beeta ppointts too thee datta inn KLiiteraalDess1constt TPttrC ggammaa(betta); / PPointts too thee datta inn betta, KKLiteeralDDes1gammaa.Sett(alppha); / Geneeratees a
41、warnning, butt poiints to aalphaa这里应当加加一些示范范代码TPtrTPtr 是可修改改的指针描描述符,它它可用来访访问和修改改字符串或或二进制数数据。TDDesC 和TDees所提供供的所有的的操作都适适用于TPPtr。这这个类定义义了一些构构造方法,使使得它能从从指向内存存的指针构构造,并设设置适当的的长度值和和最大长度度值。编译器也会会产生隐式式的构造方方法和拷贝贝构造方法法,因为它它们没有被被声明为保保护的或私私有的。一一个TPttr对象可可以从其它它的可修改改描述符构构造,例如如:通过在在不可修改改的描述符符上调用DDes()方方法,这个个方法返回回一
42、个如下下所示的TTPtr对对象:_LIT(KLitterallDes11, JJackddaws lovee my big sphiinx oof quuartzz);TBufCC buff(KLiiteraalDess1); / TTBufCC aree desscribbed llaterrTPtr ptr(buf.Des(); / CCopy consstrucctionn; caan moodifyy thee datta inn buffTInt lenggth = ptrr.Lenngth(); / Leengthh = 337TInt maxLLengtth = ptr.MaxL
43、Lengtth(); / Maxiimum lenggth = 60, as for bufTUintt8* mmemorryLoccatioon; / Vaalid poinnter intoo memmory.TInt len = 122; / Lenngth of ddata to bbe reepressenteedTInt maxLLen = 32; / Maxiimum lenggth tto bee reppreseentedd/ Coonstrruct a poointeer deescriiptorr froom a poinnter intoo memmoryTPtr88
44、memmPtr(memooryLoocatiion, maxLLen); / lenggth = 0, max lenggth = 32TPtr88 memmPtr22(memmoryLLocattion, lenn, maaxLenn); / leengthh = 112, mmax = 32另外,TPPtr提供了了赋值运算算符=(),用来拷拷贝数据到到指针所指指向的内存存(数据源源可以是可可修改、不不可修改的的指针描述述符,或以以0结尾的的字符串)。如果要拷拷贝的数据据的长度超超过了描述述符的最大大长度,会会引发一个个系统异常常。像TPPtrC一一样,TPPtr也定定义了一个个Set()方
45、方法,用来来改变描述述符所指向向的数据。_LIT(KLitterallDes11, JJackddaws lovee my big sphiinx oof quuartzz);TBufCC buff(KLiiteraalDess1); / TTBufCC aree desscribbed llaterrTPtr ptr(buf.Des(); / PPointts too thee conntentts off buffTUintt16* memooryLoocatiion; / VValidd poiinterr intto meemoryy.TInt maxLLen = 40; / Maxi
46、imum lenggth tto bee reppreseenteddTPtr memPPtr(mmemorryLoccatioon, mmaxLeen); / llengtth = 12, max lenggth = 40/ Coopy aand rreplaacememPttr = ptr; / memPPtr ddata is KKLiteeralDDes1 (37 bytees), maxLLengtth = 40_LIT(KLitterallDes22, TThe qquickk broown ffox jjumpss oveer thhe laazy ddog);TBufCC bu
47、uf2(KKLiteeralDDes2); / TBuufC aare ddescrribedd latterTPtr ptr22(buff2.Dees(); / Poiints to tthe ddata in bbuf/ Reeplacce whhat pptr ppointts tooptr.SSet(pptr2); / ptrr poiints to cconteents of bbuf2, maxx lenngth = 1000memPttr = ptr22; / Atttemptt to updaate mmemPttr whhich paniics bbecauuse tthe/
48、 coontennts oof pttr2 (43 bbytess) exxceedds maax leengthh of memPPtr (40 bbytess)您一定不要要混淆了SSet()方方法和=()赋值操操作。前者者将描述符符的指针重重置,使它它指向新的的数据区域域,而后者者将数据拷拷贝到描述述符中,一一般来说,这这会更改描描述符的长长度,但不不会更改它它的最大长长度值。3.5 基基于栈(sstackk-bassed)的的缓冲区描描述符基于缓冲区区的描述符符也可以分分为可修改改的TBuuf和不可可修改TBBufC的的两种类型型。对这种种描述符来来讲,字符符串数据本本身就是描描述符的一
49、一部分。下下图给出了了描述符的的内存布局局:iLength 12iMaxLengthHello World!TBufiLength 12Hello World!TBufC这两种描述述符通常用用来存储定定长的或相相对较小的的字符串,常常用来存放放长度小于于256个个字符的文文件名。类类似于C语语言中的cchar,但是是,它们具具有检查内内存溢出的的功能。TBufCCTBufCC是不不可修改的的缓冲区类类型,它主主要用来存存放字符串串常量或是是二进制数数据。该类类从TBuufCBaase类派派生,尖括括号内内的数字表表示分配给给该描述符符的数据区区的大小。它定义了了一些构造造方法,允允许从其它它的
50、描述符符或以0结结尾的字符符串构造。也允许创创建一个空空的描述符符,然后再再填充。由于该描述述符的数据据是不可修修改的,它它的整个内内容可以被被置换(通通过该类的的所定义的的赋值操作作),用来来置换的数数据可以是是其它的不不可修改的的描述符或或是0结尾尾的字符串串,但是,无无论是何种种情况,新新数据的长长度都不能能超过长度度n(也就就是创建该该类的时候候指定的模模板参数)。_LIT(KPallindrrome, Saatan, osccillaate mmy meetalllic ssonattas);TBufCC buff1(KPPalinndromme); / CConsttructted
51、 ffrom liteeral desccripttorTBufCC buff2(buuf1); / Consstruccted fromm buff1/ Coonstrructeed frrom aa NULLL-teerminnatedd C sstrinngTBufCC buff3(TTTextt*)NNeverr oddd or evenn);TBufCC buff4; / Coonstrructeed emmpty, lenngth = 0/ Coopy aand rreplaacebuf4 = buuf1; / bbuf4 conttainss datta coopiedd fro
52、om buuf1, lenggth mmodiffiedbuf1 = buuf3; / bbuf1 conttainss datta coopiedd froom buuf3, lenggth mmodiffiedbuf3 = buuf2; / PPanicc! Maax leengthh of buf33 is insuufficcientt forr buff2 daata该描述符中中的数据可可以被整体体置换,但但不能被直直接修改,但但有时候我我们的确需需要修改缓缓存区中的的数据,该该怎么办呢呢?系统提提供了另一一种途径来来修改数据据。该类定定义了Dees()方方法,它为为缓存区中中的数据
53、返返回一个可可修改的指指针描述符符(TPttr)。我我们可以通通过这个指指针描述符符间接地修修改缓冲区区中的数据据。当数据据通过指针针描述符被被修改以后后,指针描描述符和缓缓冲区描述述符中的iiLenggth的值值会跟着改改变,但要要记住,缓缓存区描述述符的长度度值只可能能减小,而而是不可能能增大的,因因为,描述述符类是不不提供内存存管理管理理功能的。_LIT88(KPaalinddromee, SSatann, osscilllate my mmetalllic sonaatas);TBufCC8 buuf(KPPalinndromme); / CConsttructted ffrom li
54、teeral desccripttorTPtr88 ptrr(buff.Dess(); / dataa is the striing iin buuf, mmax llengtth = 40/ Illlusttratees thhe usse off ptrr to copyy andd repplacee conntentts off buffptr = (TTText88*)DDo Geeese see God?;ASSERRT(pttr.Leengthh()=buf.Lenggth();_LIT88(KPaalinddromee2, Are we nnot ddrawnn onwward
55、, we few, draawn oonwarrd toonew eera?);ptr = KPaalinddromee2; / Paanic! KPaalinddromee2 exxceedds maax leengthh of ptr(=40)TBuf这也是一个个模板类,它它是一个可可修改的缓缓冲区描述述符类,后后面的表示缓缓冲区大小小。TBuuf从TBBufBaase类派派生,而TTBufBBase是是从TDees派生的的,因此,它它继承了TTDes和和TDessC类所有有的方法。像TBuufC一样,TBuff也也定义了一一系列的构构造方法和和赋值操作作。对所有有的描述符符类型来讲讲,内
56、存管管理是您的的责任,尽尽管这个缓缓冲区中的的数据是可可修改的,但但它的长度度不能超过过在构造方方法中所给给定的最大大值(n)。假如缓冲冲区的内容容需要扩展展,那么您您必须决定定是在编译译的时候就就给定一个个足够大的的值,或是是在运行的的时候动态态分配内存存。但无论论哪种情况况,都要确确保数据长长度不要超超过缓存区区的最大长长度。如果需要使使用动态分分配的内存存,您可以以使用基于于堆的描述述符,这个个我们在后后面要讲到到。要是您您觉得管理理内存分配配的任务太太过繁重,您您也可以选选择使用动动态数组。不过,您您应当记住住,使用动动态数组的的额外开销销是很高的的。_LIT(KPallindrrom
57、e, Saatan, osccillaate mmy meetalllic ssonattas);TBuf buf11(KPaalinddromee); / Coonstrructeed frrom lliterral ddescrriptoorTBuf buf22(buff1); / CConsttructted ffrom consstantt bufffer desccripttorTBuf88 buff3(TTTextt8*)Do GGeesee seee Godd?); / fromm C sstrinngTBuf buf44; / Connstruuctedd emppty, le
58、nggth = 0, maxiimum lenggth = 40/ Illlusttratee coppy annd reeplaccebuf4 = buuf2; / bbuf2 copiied iinto buf44, uppdatiing llengtth annd maax leengthhbuf3 = (TTTextt8*)Murdder ffor aa jarr of red rum; / upddatedd froom C striing3.6 基基于堆的(HHeap-Baseed)缓冲冲区描述符符当您要使用用非常长的的字符串时时,有另外外一种选择择:基于堆堆的描述符符。它能拥拥有
59、比它的的创建者更更长的生存存期。当您您在编译的的时候还不不能确定缓缓冲区长度度的时候,堆堆描述符也也是很有用用的,这时时,它的作作用相当于于C语言中中的mallloc。HBufCC也许您已经经发现,HHBufCC的类名以以“H”开头,这这不符合SSymbiian系统统中惯用的的命名习惯惯。这的确确是一个特特例,“H”表示这个个类一般是是在堆(HHeap)上上分配的。HBuffC定义了了静态的NNewL()方方法,用来来在堆上创创建一个缓缓存区。正正如您所见见到,HBBufC中中的字母“C”表示这个个表述符是是不可修改改的。对该该类的操作作几乎和TTBufCC一一样:该类类提供了一一套赋值操操作
60、,允许许整个缓冲冲区中的内内容被替换换掉;同样样,新内容容的长度不不能超过缓缓存区的大大小,否则则会引起系系统异常;通过调用用Des()方法,可可以返回一一个可修改改的指针描描述符(TTPtr),可可以通过这这个指针描描述符来更更改缓冲区区中的内容容。_LIT(KPallindrrome, Doo Geeese ssee GGod?);TBufCC staackBuuf(KPPalinndromme);/ Alllocaates an eemptyy heaap deescriiptorr of max lenggth 220HBufCC* heeapBuuf = HBuffC:NNewLCC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- oa系统涉密自查内容
- 因数与倍数(教学设计)-2023-2024学年五年级下册数学苏教版
- 山西省平遥县高中数学 第二章 基本初等函数(Ⅰ)2.2.1 对数与对数运算(3)教学实录 新人教A版必修1
- 水资源高效利用的国际经验借鉴计划
- 2025年贵金属靶材项目合作计划书
- 提升社区服务中心安全管理的措施计划
- 教学大纲编写计划
- 2024年五年级品社下册《日新月异的交通》教学实录 浙教版
- 第五单元 扇形统计图 教案2024-2025学年数学六年级上册-北师大版
- 思政教育故事:孔融让梨
- 精神科进修医生出科小结
- 《井下探放水培训》课件
- 英语四六级翻译预测50篇
- 混凝土外加剂凝结时间-自做
- 初中微机考试试题
- 医院诊断证明书word模板
- SPSS操作:轻松实现1:1倾向性评分匹配(PSM)
- 简单版广州市劳动合同
- 急诊室 缩短急性脑卒中患者溶栓时间PDCA汇报
- 新高处安装维护拆除作业专题培训课件
- 水电解质紊乱酸碱平衡
评论
0/150
提交评论