默认构造函数自动创建的数组元素?

时间:2015-04-24 15:56:00

标签: c++

我有一个课可以说aClass

class aClass
{
   public:
   int data;
   aClass(): data(-1) { //default constructor
   }
   aClass(int x): data(x) {  //int constructor
};

如果我创建一个类似

的数组
aClass* arr=new aClass[10];

问题1: 我原以为没有aClass对象被创建,因为它只是一个数组的声明,但在我测试的程序中看起来像arr[0]arr[9]所有指向{{1}的aClass 1}}在其类中由默认构造函数创建的对象?因为我测试了该程序,结果是a[0].data=-1一直到a[9].data=-1

问题2:如果使用默认构造函数创建对象,我应该如何创建一个包含int构造函数创建的对象的数组?显然我不能写像

这样的代码
aClass* arr=new aClass(2015)[10];

4 个答案:

答案 0 :(得分:3)

  

问题1:我认为没有创建aClass对象,因为它只是一个数组的声明

你错了。这是一个指针的声明,它使用new aClass[10]的返回值进行初始化,构造一个包含10个对象的数组。

  

但在我测试过的程序中看起来像arr [0]到arr [9]所有指向由其类中的默认构造函数创建的aClass对象?

是的,你的观察是正确的。

  

问题2:如果使用默认构造函数创建对象,我应该如何创建一个包含由int构造函数创建的对象的数组?

从c ++ 11开始,你可以使用列表初始化:aClass *foo = new aClass[3]{1, 2, 3};作为注释中的chris指示。

您可能想要使用std :: vector。有std::vector::vector(size_type n, const value_type& val)用于构建副本,因为c ++ 11:std::vector::vector(initializer_list<value_type>)用于不同的值。

使用静态/自动数组,即使在c ++ 11之前也可以进行聚合初始化:

aClass foo[3] = { 1, 2, 3 }; 

答案 1 :(得分:1)

而不是aClass* arr=new aClass(2015)[10]; 如果你的编译器支持它,你可以aClass *arr = new aClass[10]{2015, 2015/*etc*/};

在C ++ 11中,这两者意味着相同的事情。

aClass *arr = new aClass[10];
aClass *arr = new aClass[10]{};

更好的选择是使用std::vector并避免使用原始指针而是使用智能指针ex。 std::unique_ptr

此替代方案的示例可以是:

int main()
{
    vector<unique_ptr<aClass>> vec;
    for (int i{0}; i != 10; ++i)
        vec.emplace_back(new aClass(2015));

    for (auto const& i : vec) // print data
        cout << i->data << endl;

    return 0;
}

答案 2 :(得分:0)

关于问题1. initialization的规则非常严格。数组new[]表达式创建一个值数组。必须初始化这些值,默认情况下它们使用default initialization

问题2的答案是你不能用动态数组做到这一点。但是,std::vector确实提供了一个构造函数,允许您提供将被复制到每个包含元素的对象。请参阅explicit vector(size_type count, const T& value = T(), const Allocator& alloc = Allocator())

如果希望集合中的每个元素不同,则必须使用循环并单独分配元素,除非静态确定数组的大小,在这种情况下可以使用初始化表达式。如果要避免动态容器的初始默认构造,则不应按值存储对象。你应该使用一个指针容器或更好的容器智能指针。然后,您可以对每个对象使用直接初始化。

答案 3 :(得分:0)

如果要在不创建对象的情况下创建数组,则需要创建指针数组。例如,aClass** arr = new aClass*[10];创建一个指针数组。当您想要创建实际对象时,您需要执行以下操作:arr[0] = new aClass(2015);