C++对象数组的初始化
如果⼀个类有默认的构造函数,使⽤new动态实例化⼀个对象数组不是件难事,如下代码:
class animal
{
public:
animal():num(0)
定义数组初始化{}
~animal()
{}
private:
int num;
};
Animal *ani = new Animal[5];
delete[]ani;
然⽽ new Obj[n]的形式仅仅适⽤于不需传⼊实参的默认构造函数,否则编译器报错。想要初始化对象数组的同时指定各个构造函数的参数,有以下⼏种解决途径:
1.若初始化对象数组时已知其size,使⽤诸如 new Obj[n]{(),(),...()} 的形式,⼤括号内每个⼩括号对应每个对象的构造函数参数:
class Array1D
{
public:
Array1D(int len2)
:len2D(len2)
{
plist = new T[len2];
for (int i = 0; i < len2; i++)
plist[i] = static_cast<T>(0);
}
~Array1D()
{
if (nullptr != plist)
delete[] plist;
}
private:
T* plist;
int len2D;
};
pArray1D = new Array1D[2]{(1),(2)}
2.若初始化对象数组时未知其size,需要把分配内存和构建对象的动作分开。可借助C++11的allocator。先使⽤allocate分配内存并⽤指针记录这块空间;然后⽤construct⽅法对指针所指向内存进⾏对象构建;当然不再使⽤对象时⽤destory⽅法析构对象;注意,既然分配内存和构建对象动作已分开,那么析构对象和释放内存也要配对,⽤deallocate释放内存:
//class Array1D
class Array1D
{...};
//Array2D
Array2D(int len1, int len2)
:len1D(len1)
{
pArray1D = alloc.allocate(len1);
for (int i = 0; i < len1; i++) {
}
}
~Array2D()
{
for (int i = 0; i < len1D; i++) {
alloc.destroy(pArray1D + i);
}
alloc.deallocate(pArray1D, len1D);
}
private:
Array1D* pArray1D;
int len1D;
allocator<Array1D> alloc;
};
3.使⽤operator new和placement new,与allocator原理类似,分四步⾛:
animal():num(0)
{}
animal(int _num):num(_num)
{}
~animal()
{}
void show() {
cout << num << endl;
}
void* operator new(size_t size, void* p)
{
return p;
}
private:
int num;
};
int main(int argc, char* argv[])
{
{
// operator new
void* p = operator new(5 * sizeof(animal)); animal* a = static_cast<animal*>(p);
// placement new, constructor
for (int i = 0; i < 4; i++)
{
new(a + i) animal(i);
}
new(a + 4) animal;
// use
for (int i = 0; i < 5; i++) {
(a + i)->show();
}
// destructor
for (int i = 0; i < 5; i++) {
(a + i)->~animal();
}
// delete
delete[] p;
}
return 0;
}
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论