作者:董维春 网名:ch_builder
(版权要求:请务必尊重知识产权,未经授权不要转载、摘录)
11)在CB中听说有动态数组之说,我想问什么是动态数组?
答:动态数组(DynamicArray)是CB中引起的,它可以动态地改变数组长度,并且象一般数组那样易于使用。DynamicArray可以说是VCL中的一个重大的革新。
12)动态数组是如何实现与应用的呢?
答:动态数组是以类的方式实现的。CB提供了DynamicArray类模板,使用这个类模板可以声明实际动态数组。使用下面的语法:
DynamicArray<type>ArrayName;
其中type为动态数组的数据类型,动态数组支持任何类型的数据、对象,甚至是一个动态数组对象。例如可以这样声明一个动态数组:
DynamicArray<DynamicArray<AnsiString>>aArray;
这相当于声明了一个二维动态数组。
动态数据具有一个Length属性,通过这个属性可以设置或获得数组的长度。例如:
DynamicArray<int>IntArray;
IntArray.Length=10;
ShowMessage(“ArrayLength:”+IntToStr(IntArray.Length));
若是要释放一个动态数组,应该将该数组的Length属性设为0。
动态数组有Low和High两个属性,分别表示动态数组的起始下标和中止下标。起始下标总是为0,而中止下标总是等于Length-1。
动态数组实现了“=”操作符,可以复制整个数组到另一个数组。同时,动态数组还提供了Copy和CopyRange方法,CopyRange方法可以复制指定范围的数据。
13)VCL对象在堆中与在栈中创建是不是都可以?
答:VCL对象只能在堆中创建,在栈里不可以的。
栈是存放函数的所有动态局部变量及函数调用和返回的有关信息的一块内存。栈的内存管理严格遵循先进后出的顺序,这一点正是实现函数调用所需要的。从栈中分配内存效率特别高。数据对象使用栈中的内存(如动态局部变量)比使用堆中内存会使程序运行更快。
堆提供了malloc()、calloc()、realloc()和new等函数获取内存空间的一块内存。从堆中获取内存比从栈中要慢得多,但堆的内存管理却比栈灵活得多,任何时候你都可以从堆中获取(或释放)内存,我们可以按任意顺序进行。用来存放递归数据结构的内存几乎都要从堆中获取。用来存放字符串的内存通常也从堆中获取,尤其是对那些在程序运行时可能出现的很长的字符串。
从堆中获取的内存要用free()、delete来释放,它本身不会自动释放。
由于Object Pascal中所有的对象都只能建构于堆中,无法和C++一样,能够在栈(在函数内创建类的对象)、数据区段(在函数外创建类的对象)、堆(用new等函数来创建类的对象)三种地方建立对象,所以VCL类的对象我们只能在堆中创建。
如创建一个按钮对象,我们可以这样来创建:
TButton *btnMy= new Tbutton(NULL);
可以写成如下程式:类名 *对象名=new 类名();
()里面可以是你已创建的该类对象实体的名字,工程的名字,或NULL。
14)问:dynamic_cast是用来做什么的?
答:dynamic_cast 可以把某种对象强制转成另一个类,这里所谓的强制仍有其局限,也就是说,如果类转不过来,那么系统将不会进行转换操作的。若类型转换无法成功则返回一个值是0的指针。若参数T是一个参考类型,而类的转换又失败了,系统将会丢出一个异常处理信息:Bad_cast。但你放心这不会导致系统死机,所以可以放心使用。其程式:
dynamic_cast <T> (ptr)
T参数一定要是一个指针、void* 、或是已经定义过的类,而ptr参数则必须是一个指针(pointer) 或是一个引用(reference)。如果T的类型是void*,那么ptr则是一个可以访问最下面类里的任何成员,当然这样的类将不可以是基础类。
(未完待续)