数组的定义:
Point knots[10] ;
一般而言这是经由一个或多个runtime library函数达成的。在cfront中,我们使用一个被命名为vec_new()的函数,产生出以class objects构造而成的数组。比较新近的编译器,包括Borland、Microsoft和sun则是提供了两个函数,一个用来处理“没有virtual base class ”的class,另一个用来处理“内含virtual base class”的class,后一个函数通常称为vec_vnew()。函数类型通常如下:
void*
vec_new(
void *array, //数组起始地址
size_t elem_size, //object的大小
int elem_count, //数组长度
void (*constructor)(void*),
void (*destructor)(void*)
)
其中的constructor和destructor参数是这一class之default constructor和default 的destructor的函数指针。
参数array持有的若不是具名数组的地址(本例为knots)就是0。如果是0,那么数组将经由应用程序的new运算符,被动态配置于heap中。
在vec_new ()中,constructor施行于elem_count个元素之上,对于支持Exception handling的编译器而言,destructor的提供是必要的。下面是编译器可能针对我们的10个Point元素所做的vec_new()调用操作:
Point knots[10];
vec_new(&knots,sizeof(Point),10,&Point::Point,0);
如果Point定义了destructor,当knots的生命结束时,该destructor也必须施行于那10个Point元素身上。这是经由一个类型的vec_delete()的runtime library函数完成,函数类型如下:
void *
vec_delete(
void *array, //数组起始地址
size_t elem_size, //object大小
int elem_count, //数组长度
void (*destructor)(void*,char)
)
如果程序员提供一个或多个明显初值给一个由class objects组成的数组,如下所示:
Point knots[10] = {
Point(),
Point(1.0,1.0,1.5),
-1.0
}
对于这些明显获得初值的元素,vec_new不再有必要;对于那些尚未被初始化的元素,vec_new()的施行方式就像面对“由class elements组成的数组,而该数组没有explicit initialization”一样,因此上一个定义很可能被转换为:
//显式地初始化前3个元素
Point::Point( &knots[0]);
Point::Point( &knots[1],1.0,1.0,1.5);
Point::Point( &knots[2],-1.0,0,0);
//以vec_new初始化后7个元素
vec_new(&knots+3,sizeof(Point),7,&Point::Point,0);