带来的限制
一 产生对象数组
一个类缺乏default construtor的时候,一般而言没有任何方法传递变量给数组中的对象的默认构造函数。
- 使用non-heap数组
class C{
public:
C(int);
};
//实现
int id1, id2, id3;
C cvector[] = { C(id1), C(id2), C(id3)};
- 使用指针数组代替对象数组
typedef C* PTRC;
PTRC ptrcvector[10];
ptrcvector = new PTRC[10];
for( int I = 0; I < 10; ++I) {
ptrcvector[I] = new C(I);
}
缺点:回收内存、指针占用空间。
- 使用place new方式
void *rawmemory = operator new[] (10*sizeof(C));
C *ptrcvector = static_cast<C*>(rawmemory);
for(int I = 0; I < 10; ++I){
new(&ptrcvector[I]) C(I);
}
二 使用基于模版的容器
使用基于模版的容器内部一般具有一个对象数组的结构,所以会使用到默认构造函数。
三 虚基类
使用继承时,子类需要初始化父类的成员,所以不管继承层次多深,子类都需要准确了解父类的参数,并准确的传递。
好处
可以明确对象处于一个正确的初始化状态,减少了类的复杂度,提高了效率。