C++中的默认构造函数

时间:2014.03.08

地点:基地二楼

------------------------------------------------------------------------

一、简述

  C++中的默认构造函数使得在类的对象生成时无需提供任何基本信息也能初始化对象。比如数值类的对象一般初始化为0,指针类对象初始化为null等。但还有些情况,有些对象如果没有额外信息无法完成初始化动作,比如你手机里的电话簿字段的类,如果没有获得外界指定的人名产生的对象将会毫无意义。再比如公司生产的仪器设备每台都有一个识别编号,为这种用途(模拟仪器设备)产生的对象如果不提供适当的ID号码也是毫无意义的。因此,在现实世界里,可以合理从无到有生成对象的类应该含有默认构造,而必须有某些外来信息才能生成对象的类不必拥有默认构造。但当一个类缺乏默认构造时使用起来又会有某些限制,这是后面会详细讨论的内容。

------------------------------------------------------------------------

二、问题

  考虑一个为公司仪器设计的类,仪器编号是每台仪器的必要属性。于是这个类定义如下:

class EquipmentPiece{
public:
  EquipmentPiece(int id_number);
  ......
};
这样EquipmentPiece就没有默认构造函数了,于是问题也就有了。
在一个设备系列中,比如产生一个数组,于是在这里很不方便为数组中对象指定ID号。所以几乎不可能产生一个由EquipmentPiece对象构成的数组。比如:

EquipmentPiece best_pieces[10];  //错误,因为类无默认构造函数,无法调用
EquipmentPiece *best_pieces_ptr=new EquipmentPiece[10];  //错误

------------------------------------------------------------------------

三、解决问题


1.使用非堆数组,在定义数组时提供必要的自变量信息:这样做的缺点一是要记得删除数组所指的所有对象,否则会造成资源泄露。二是内存总量变大,因为你需要空间放置指针还需要空间放置EquipmentPiece对象。
int ID1,ID2,ID3,......ID10;
...
EquipmentPiece best_pieces[]={
  EquipmentPiece(ID10,
  EquipmentPiece(ID2),
  EquipmentPiece(ID3),
  EquipmentPiece(ID4),
  ......
  EquipmentPiece(ID10)
};
缺点是无法扩展堆数组

2.使用指针数组而非对象数组

typedef EquipmentPiece* FEP;  //PEP是指向EquipmentPiece的指针
PEP best_pieces[10];  //定义一个指针数组,无需调用ctor
PEP *best_pieces=new PEP[10];// 也不错
现在,数组中各指针可用来指向不同的EquipmentPiece对象
for(int i==0;i<10;++i)
  best_pieces[i]=new EquipmentPiece(ID Number);

------------------------------------------------------------------------

四、总结

  添加无意义的默认构造器也会影响类的效率,所以一句话除非一定需要,否则不提供默认构造函数。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值