第2 章语法摘述  2.1 抽象数据类型CBuilder 中以类的方式提供了几个非常有用的抽象数据类型。包括TList  链表 类、AnsiString 类、Set  集合 类、DynamicArray  动态数组 类和TStream  流 类。在程序编写过程中 这几个类的使用在很多地方都起到很重要的作用。2.1.1 TList 类TList 实现了线形链表 可以用来存储任意类的对象 包括用户自定义的类。虽然它是链表 但是它实际上是一个存放指针的数组 可以通过其Items 属性象访问一个数组那样实现对TList 对象的每一个元素的访问。TList 类提供了足够的属性和方法实现对链表的各种操作 如全套插入、删除、查、排序以及提供链表元素数目 Count 属性 等属性。
1 TList 类的主要属性有  Capacity 属性__property int Capacity readFCapacity writeSetCapacity nodefault 设定Capacity 指定TList 对象中的元素
个数 并为新增加的元素分配内存。如果没有足够的内存为新元素分配空间 将会抛出一个EOutOfMemory 异常。这里需要注意Capacity 属性和Count 属性的不同。Count 属性是TList 对象中Items 属性的元素个数 而Capacity 是TList 类可以包含的元素个数 由分配了多少的内存决定 Capacity 总是大于或者等于Count。将一个元素插入链表 其Capacity 属性会自动随之更改。如果需要多次的执行添加操作 那么可以先设置Capacity 这样就能避免每次Add 方法都要重新指定内存
从而提高程序的执行效率 如下面的代码  List-gtClear List-gtCapacity Count for int I 0 I lt Count 代码中 在循环执行Add 之前先指定了Capacity 属性 这样就避免了循环中Add 的分配内存的操作
提高了程序的效率 而且 也避免了分配内存时的异常。Count 属性__property int Count readFCount writeSetCount nodefault 标志TList 对象中的Items 数组的个数 也即Items 数组的大小。对Count 属性的更改可以实现对数组末尾处元素的添加和删除。需要注意的是Count 属性并不一定是TList 对象中元素的个数 它也包含Items 数组中的空指针的数目。如果要删除数组中的空指针 可以使用TList 的Pack 方法。Items 属性__property void Itemsint Index readGet writePut 通过Items 属性可以象数组那样访问链表中的元素。List 属性typedef void TPointerList134217727 typedef TPointerList PPointerList __property PPointerList List readFList 获取直接进入列表中元素数组的指针。 2 TList 类的主要方法有  Add 方法int __fastcall Addvoid Item Add 方法在TList 对象的数组末尾添加一个元素 返回值为添加的元素的数组下标。如果添加后Count 大于Capacity 那么将会重新为之分配内存。需要注意的是 不管Items 数组中有没有NULL 元素 Add 方法都只是在数组的末尾添加元素。Clear 方法virtual void __fastcall Clearvoid 清除链表中的所有元素。此方法执行之后 将释放所有内存 置Capacity 为0。Delete 方法void
__fastcall Deleteint Index 删除数组中下标为Index 的元素。Delete 方法并不释放元素占用的内存 也即不改变Capacity 的值。Exchange 方法void __fastcall Exchangeint Index1 int Index2 交换链表中两个元素的位置。Expand 方法TList
__fastcall Expandvoid Expand 方法为TList 链表增加内存空间。如果Count 属性还没有达到Capacity 则此方法不做任何操作 如果Capacity 等于Count 则按照下面规则增加空间 Capacitygt8 则将Capacity 增加
16 Capacitygt4 且Capacitylt9 将Capacity 增加8 Capa citylt4 则将Capacity 增加4。IndexOf 方法int __fastcall IndexOfvoid Item 查列表中指定元素的数组下标。Insert 方法void
__fastcall Insertint Index void Item 在列表中的指定位置添加元素。Move 方法void __fastcall Moveint CurIndex int NewIndex 将CurIndex 位置的元素移动到NewIndex 位置 此操作将覆盖原来NewIndex 位置的元素。Pack 方法void
__fastcall Packvoid 删除Items 列表中所有指针值为NULL 的元素。此操作并不释放内存 即只会改变Count 属性的值 不会改变Capacity 属性。Remove 方法int
__fastcall Removevoid Item 根据元素的值删除列表中的指定元素。返回值为元素删除之前的位置。Add 方法和Remove 方法的参数都是列表的元素对象 其示例如下  void __fastcall TForm1::Button1ClickTO bject Sender TList pList new TList AnsiString TheObject quotThis is an object.quot try pList-gtAddTheObject // 添加AnsiString 实例到pList 列表MessageDlgquot列表中有quot IntToStrpList-gtCount quot个元素quot mtInformation TMsgDlgButtons ltlt mbOK 0 pList-gtRemoveTheObject MessageDlgquot列表中有quot IntToStrpList-gtCount quot个元素quot mtInformation TMsgDlgButtons ltlt mbOK 0 __finally delete pList Sort 方法typedef int __fastcall TListSortComparevoid Item1 void Item2 void __fastcall SortTListSortCompare Compare 通过自定义的比较函数Compare 来对列表中的元
素进行排序。如下面代码  int __fastcall CompareNamesvoid Item1 void Item2 return CompareTextTComponent Item1-gtName TComponent Item2-gtName void __fastcall TForm1::Button1ClickTObject Sender List1-gtSortCompareText    2.1.2 AnsiString 类AnsiString 是CBuilder 中仿照Object Pascal 语言中的长字符串类型设计的一个字符串类 在CBuilder 中 几乎所有用到字符串的地方都无一例外的使用AnsiString
类型。比较C中提供的字符串类型 AnsiString 提供了更多实用、方便的方法。本质上 AnsiString 仍然采用C/C的字符串结构 以’0’作为字符串的结尾标志 只
是在字符串的前面添加了几个字节的信息头。AnsiString 定义了一系列操作符 包括赋值、比较等操作 具体如下 赋值 “” 字符串连接 “”、“” 字符串比较 “”、“gt”、“lt”、“lt”、“gt”、“” 访问 “” 用此操作符可以象数组一样访问字符串中的字符 不同的是 在AnsiString 中 第一个字符的下标为1 而不是0。AnsiString 类的常用的方法有  c_str 方法char __fastcall c_str const 返回与AnsiString 相同字符内容的C/C标准字符串指针 即以’0’NULL作为结尾标志的字符串。如果AnsiString 字符串还没有赋值 那么此方法将返回一个空字符串””。此方法主要用于字符串的读取 如果要修改字符串 应该使用其Insert、Delete 方法 或者操作符。Delete 方法AnsiStringamp __fastcall Deleteint index int count 在字符串中删除从index 开始的count 个字符。如果index 大于字符串的长度 则此方法不删除任何字符 如果count 大于从index 开始的剩余字符数目 则此方法删除从index 开始的所有剩余字符 如果count 小于0 此方法不删除任何字符。FormatFloat
static AnsiString __fastcall FormatFloatconst AnsiStringamp formatconst long doubleamp value 将value 用format 指定的格式转换为字符串形式。典型的格式如下 表2-1 FormatFloat 常用格式示例Format string 1234 -1234 0.5 0 1234 -1234 0.5 0 0 1234 -1234 1 0 0.00 1234.00 -1234.00 0.50 0.00 . 1234 -1234 .5 0.00 1234.00
-1234.00 0.50 0.00 0.000.00 1234.00 1234.00 0.50 0.00 0.00Zero 1234.00 -1234.00 0.50 Zero 0.000E00 1.234E03 -1.234E03 5.000E-01 0.000E00 .E-0 1.234E3 -1.234E3 5E-1
0E0 Insert 方法AnsiStringamp __fastcall Insertconst AnsiStringamp str int index 在AnsiString 字符串的index 位置插入字符串str。IntToHex 方法static AnsiString
__fastcall IntToHexint value int digits 将一个整数转换为16 进制的字符串形式。IsEmpty 方法bool __fastcall IsEmpty const 判断字符串是否为空串。如果为空 返回true 否则 返回false。Length 方法int __fastcall Length const 返回字符串的长度 即字符串中的字符数 字节为单位。LoadStr 方法static AnsiString __fastcall LoadStrint ident static AnsiString __fastcall LoadStrHINSTANCE hInstance int ident 从指定句柄中读取标志为ident 的字符资源。如果没有指定句柄 则从当前模块 如可执行程序 中读取。LoadString 方法AnsiStringamp __fastcall LoadStringHINSTANCE hInstance int ident 从资源中读取字符串 与LoadStr 不同
之初在于他们的返回值的类型。LowerCase/ UpperCase 方法AnsiString __fastcall LowerCase const AnsiString __fastcall UpperCase const 返回一个包含原AnsiString
字符串中所有字符的新字符串 且所有字符都是小/大写形式 原字符串的内容不改变。Pos 方法int __fastcall Posconst AnsiStringamp subStr const 返回字符串中一个子串subStr 的开始位置。如果字符串中不包含指定的子串 则返回0。SetLength 方法AnsiStringamp __fastcall SetLengthint newLength 将字符串的Length 属性改为newLength。StringOfChar 方法static AnsiString __fastcall StringOfCharchar ch int count 返回一个包含count 个字符ch 的字符串 如 AnsiS tring s
AnsiString::StringOfCharA 10则字符串s 为quotAAAAAAAAAAquot。SubString 方法AnsiString __fastcall SubStringint index int count const 返回字符串的一个子串 子串由原字符串中位置index 开始的count 个字符组成。ToDouble/ ToInt/ ToIntDef 方法double __fastcall ToDouble const ToDouble 方法将字符串转换为一个浮点数。如果字符串无可用的转换字符 产生异常。int __fastcall ToInt const int __fastcall ToIntDefint defaultValue const ToInt 和ToIntDef 方法都是将字符串转换为一个整
型数 不同之处在于如果字符串没有可用的字符 前者会抛出一个异常 后者则会返回默认值defaultValue。Trim/ TrimLeft/ TrimRight 方法AnsiString __fastcall Trim const 返回一个新字符串 新字符串中删除了原字符串中前导和后随的空格字符 以及字符串中的控制字符。常用于输出字符串时删除前面和后面的空格。
AnsiString __fastcall TrimLeft const AnsiString __fastcall TrimRight const TrimLeft 和TrimRight 分别用于删除字符串前导和后随的空格字符以及控制字符。2.1.3 Set  集合  Setlttype minval maxvalgt是一个C类模板 仿照Delphi 中的Set 类而得 用来实现集合这个抽象数据类型。此模板使用时有三个参数 其中type 用来指定集合元素的类型 如int、char、枚举变量等  minval 为集合元素的最小值 minval 不能小于0 maxval 为集合元素的最大值 它不能大于255。每个Set 的实例都根据其三个参数创建相应的对象 如下面的代码 s1 和s2 因为其参数不同而成
为两个不同的集合类型  Set ltchar A Cgt s1 Set ltchar X Zgt s2 if s1 s2 // ERROR illegal struct. 如果要创建同一种集合类型的多个实例 可以使用typedef 如下 typedef Set ltchar AZgt UPPERCASESet 对集合变量的声明并不会对它的值初始化
可以在声明变量之后使用ltlt操作符对其进行赋值 如下  UPPERCASESet s1
s1 ltlt A ltlt B ltlt C //初始化UPPERCASESet s2 s2 ltlt X ltlt Y ltlt Z // 初始化Set 集合常用的方法有  Clear 方法Setamp __fastcall Clear 删除集合对象中的所有元素 方法执行之后 集合为空集。Contains 方法bool __fastcall Containsconst T el const 查询集合对象中是否含有指定的元素el。Empty 方法bool __fastcall Empty
const 判断一个集合对象是否含有元素。比较运算符“”、“” 分别表示集合的两个对象相等和不等的比较运
字符串函数的length属性算。operator //- 分别为集合之间的并集、交集、并集中交集的补集运算的运算符。类似于C/C中运算符与的关系 集合运算中的运算符也对应的有、和-。operator ltlt/gtgt ltlt操作符为添加指定元素到集合 gtgt为从集合中删除指定元素。在CBuilder 的编程中对集合元素的使用非常的多 如判断键盘事件和鼠标事件时 需要处理的Shift 参数 就是一个集合类型 typedef SetltClasses__1ssShiftssDoublegtTShiftState。下面一段代码示例出集合使用的方法  include ltiostreamgt include ltsystem.hppgt using name space std typedef SetltcharUZgt UpperSet typedef Setltcharazgt LowerSet typedef Setltcharajgt HalfLowerSet void set_example LowerSet ae ae2 ac de UpperSet AE AE2 AC DE HalfLowerSet aj // 由于只是定义了集合对象 所以下面的两个Contains 方法都返回false cout ltltquotSet ae quot ltlt ae.Containsaquotdoesquot:quotdoes notquot ltlt quot contain a quot ltlt endl cout ltltquotSetAE quot ltlt AE.ContainsCquotdoesquot:quotdoes notquot ltlt quot contain C quot ltlt endl ae ltlt a ltlt b ltlt c ltlt d ltlt e ae2 ltlt a ltlt b ltlt c ltlt d ltlt e ac ltlt a ltlt b ltlt c de ltlt d ltlt e aj ltlt d ltlt e DE ltlt D ltlt E //此时已经为集合添加了对象 所以ae.Containsa将为true cout ltltquotNow set ae quot ltlt
ae.Containsaquotdoesquot:quotdoes notquot ltlt quot contain a quot ltlt endl /下面一句代码有语法错误 尽管de 和aj 含有相同的元素 但是它们属于不同的集合类型
不能进行比较/ //cout ltlt deajquot quot:quot quot ltlt endl // 利用、-、进行集合运算cout ltlt quotSet ae quot ltlt aeacdequot quot:quot quot ltlt quotset ac de.quot ltlt endl cout ltlt quotSet de quot ltlt deae-acq
uot quot:quot quot ltlt quotset ae - ac.quot ltlt endl // Clear 方法的调用示例cout ltlt quotSet ae2: quot ltlt ae2 ltlt endl ae2.Clear cout ltlt quotSet ae2: quot ltlt ae2 ltlt quot after ae2.Clearquot ltlt endl //、-、进行集合运算ae2ac cout ltlt quotUnion ae2ac: Set ae2 quot ltlt ae2acquot quot:quot quot ltlt quotset ac.quot ltlt endl ae2-ac cout ltlt quotDifference ae2-ac: Set ae2 quot ltlt ae2dequot quot:quot quot ltlt quotset de.quot ltlt endl int main set_example return 0    2.1.4 DynamicArray  动态数组 在C 中 数组的大小需要预先的声明 在程序运行过程中是不能更改的 也即数组的大小是静态的。CBuilder 中 实现了动态数组 也就是在程序运行中可以动态的改变数组的大小。CBuilder 中动态数组是以类的方式实现的 它提供了动态数组类 DynamicArray 模板 声明如下  template ltclass Tgt class DELPHIRETURN DynamicArray 声明动态数组时的语法如下 DynamicArraylttypegt ArrayName 其中type 为动态数组元素的数据类型 它可以是任何数据类型、组件对象 也可以是动态数组对象 这样 便成为多维动态数组。Length 属性动态数组的大小可以通过其Length 属性来获得和更改 如下 DynamicArrayltintgt arrayOfInt arrayOfInt.Length 10 cout ltlt quotArrayLength: quot ltlt arrayOfInt.Length ltlt endl 设置动态数组的Length 为0 将释放该动态数组占用
的内存。数据访问对于动态数组的访问 实现了跟静态数组一样的“”操作符。通过该操作符可以对指定元素进行赋值和读取 示例如下  void InitArrayDynamicArrayltchargt ampc_array c_array0    A c_array1    B cout ltlt quotThird char is: quot ltlt c_array2 动态数组的范围动态数组的Low 和High 属性分别表示动
态数组最小位置和最大位置 也即它们给出动态数组的位置范围 如下  int TotalArrayconst DynamicArrayltintgtamp arrayOfInt int total0 fo r int
iarrayOfInt.Low iltarrayOfInt.High i total arrayOfInti return total Low 属性总是返
回0 High 属性返回Length-1 所以遍历一个动态数组也可以用下面的代码  for int i0 iltarrayOfInt.Length i 动态数组的赋值与比较动态数组提供“”运算符 实现
动态数组的赋值 但是 需要注意的是 将一个动态数组赋给另一个动态数组的操作仅仅是将它们的指针指向同一个位置 并不是赋值它们指向的内存内容。相似的 对两个动态数组的比较 也是比较它们的指针位置 而不是指针指向的内容。如果要赋值动态数组的内容 应该使用动态数组的Copy 或者CopyRange 方法。示例如下  void fooDynamicArrayltintgt ampi_array DynamicArrayltintgt temp
i_array asserttemp i_array // temp 和i_array 指向同一个内存地址i_array0 20 //
为数组中第一个元素赋值asserttemp0 20 // temp 数组可以看到i_array 数组中的
变化temp i_array.Copy // 拷贝i_array 数组的内容到temp 数组temp0 10 asserttemp0 i_array0 // 上面一句对temp 的第一个元素赋值 它不改变i_array 数
组//的内容CopyRange 方法的声明如下  DynamicArrayltTgt CopyRangeint startIndex int count const void CopyRangeDynamicArrayltTgt ampdst int startIndex int count const 它用来拷贝动态数组中从startIndex 开始的count 个元素到数组dst 中 使用示例如下  newArray array.CopyRange3 5 多维动态数组前面已经说道 动态数组元素的类型可以也是动态数组 这样便是多维动态数组。多维动态数组的每一维可以有不同的长度 也就是 对于每一维可以分别设定其Length 属性 如下面的代码  typedef DynamicArraylt DynamicArray l t AnsiString gt gt T2DStringArray void fooT2DStringArray amps_array SetLengths_array 10 for int i0 ilts_array.Length i // 设定每一列的长度SetLengths_arrayi i1 for int j0jlts_arrayi.Length j //对数组元素
赋值s_arrayij itoai10j    2.1.5 TStream  流 流类用于进行各种存储媒介之间的数据操作。TStream 类的几种派生.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。