对象数组与构造函数

本文深入探讨了构造函数的概念及其在类定义中的作用,特别强调了当为某一类定义构造函数时,编译器如何不再合成默认构造函数,并详细解释了其对数组初始化的影响,包括静态数组、动态分配数组以及容器初始化等方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果为某类定义了一个或多个构造函数,编译器将不合成默认构造函数,意味着:
1.该类不能用作动态分配数组的元素类型。
2.该类静态分配数组必须为每个元素提供一个显式的初始化式。
	(参考以下示例,来自http://blog.youkuaiyun.com/gogoda/article/details/4401191)

如有一个如下类:

class EquipmentPiece { private: int IDNumber; public: EquipmentPiece(int IDNumber) : IDNumber(IDNumber) {}; };

<一>、对象数组

int ID1, ID2, ID3; EquipmentPiece bestPieces[] = { EquipmentPiece(ID1), EquipmentPiece(ID2), EquipmentPiece(ID3) };

注意:

EquipmentPiece bestPieces[10];  //no appropriate default constructor available (静态数组) EquipmentPiece *bestPieces = new EquipmentPiece[10]; //no appropriate default constructor available(动态分配数组)

<二>、指针数组

typedef EquipmentPiece* PEP; //PEP是个指向EquipmentPiece的指针

PEP bestPieces[10]; //等同于 PEP *bestPieces = new PEP[10];

//然后初始化
for(int i = 0; i < 10; i++){
bestPieces[i] = new EquipmentPiece( IDNumber );
}

注意:
要记得将此数组所指的所有对象删除。如果忘了会产生资源泄露。还有就是该方法与对象数组相比需要额外内存用于存放指针。(过度使用内存 这一问题可以避免,见第三种方法)


3.如果有一个保存该类对象的顺序容器,就不能使用接受容器大小而没有同时提供一个元素初始化式的构造函数。
	容器的初始化:
	C c(n,t);用n 个值为t的元素创建容器c,其中t必须是容器类型c的元素类型的值,或者是可转化为该类型的值。
	C c(n);创建含有值初始化的元素的n个副本。容器的这种构造方式使用了默认构造函数和复制构造函数。
	例:
		vector<int> vec(10);  //10 elements,each initialized 0(内置类型初始化为0)
		vector<string> vec(10);  //10 elements,each an empty string.(调用string的默认构造函数)(编译器首先使用string默认构造函数创建一个临时值初始化vec,然后使用复制构造函数将临时值复制到vec的每个元素。)
		没有默认构造函数的类就不能使用这种方法。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值