对象数组(Array of Objects)

数组的定义:

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值