如果为某类定义了一个或多个构造函数,编译器将不合成默认构造函数,意味着: 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的每个元素。)
没有默认构造函数的类就不能使用这种方法。