4

考虑一个简单的类:

class SimpleClass {
    int a;
public:
    SimpleClass():a(0){}
    SimpleClass(int n):a(n){}
    // other functions
};

SimpleClass *p1, *p2;

p1 = new SimpleClass[5];

p2 = new SimpleClass(3);

在这种情况下,SimpleClass()调用默认构造函数来构造 p1 的新分配对象和 p2 的参数化构造函数。我的问题是:是否可以分配一个数组并使用 new 运算符使用参数化构造函数?例如,如果我希望使用变量a值分别为 10、12、15、... 的对象初始化数组,是否可以在使用 new 运算符时传递这些值?

我知道使用 stl vector 是处理对象数组的更好主意。我想知道是否可以使用 new 来分配数组。

4

2 回答 2

7

您可以将placement-new用作:

typedef std::aligned_storage<sizeof(SimpleClass), 
                             std::alignment_of<SimpleClass>::value
                             >::type storage_type;

//first get the aligned uninitialized memory!
SimpleClass *p1 = reinterpret_cast<SimpleClass*>(new storage_type[N]);

//then use placement new to construct the objects
for(size_t i = 0; i < N ; i++)
     new (p1+i) SimpleClass(i * 10);

在此示例中,我将传递(i * 10)SampleClass.

希望有帮助。

于 2013-03-11T06:08:09.897 回答
1

这是一种方法,但它并不完全是您通过 new SimpleClass[5] 实现的,因为它创建了一个指针数组而不是值数组:

SimpleClass *p[] = {
    new SimpleClass(10), 
    new SimpleClass(12), 
    new SimpleClass(15)
};

为了实现你想要的,我推荐类似于这样的代码:

SimpleClass *p2 = new SimpleClass[3];
SimpleClass *pp = p2;
*pp = 10;
*++pp = 12;
*++pp = 15;

这并不理想,因为它会在堆栈上创建临时对象并调用赋值运算符,但从代码的角度来看它看起来很干净。这里稍微牺牲了一点性能。

于 2013-03-11T06:00:26.563 回答