在C ++中声明静态/动态数组是否会自动调用每个元素的默认构造函数?

时间:2014-09-07 03:49:37

标签: c++ arrays initialization

问题出在主题中。如果原始类型与对象的行为不同,我也很好奇吗?

3 个答案:

答案 0 :(得分:1)

准确回答这是一个棘手的问题。它被多次询问(和回答),但我找不到完全相同的。

首先,声明数组不会分配任何存储,也不会导致任何构造函数被执行。也许你的意思是定义 分配一个数组。

静态存储(在任何块之外)中定义的数组的存储空间用零填充,无论它是什么类型。

自动存储(块内)中定义的数组被分配未初始化的内存。

通过分配动态存储(使用new [])创建的数组被分配未初始化的内存。

无论存储分配方法如何,数组都是default-initialised。这意味着在n3797 S8.5 / 7中定义:

  

默认初始化T类型的对象意味着:
   - 如果T是(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(12.1)(如果T没有默认构造函数或重载解析(13.3),则初始化是错误的一个   模糊性或在初始化上下文中删除或无法访问的函数中;;    - 如果T是数组类型,则每个元素都是默认初始化的;
   - 否则,不执行初始化。

换句话说,类类型的数组在每个元素上都调用了默认构造函数,而其他元素则按原样保留。

另见/ 12:

  

如果没有为对象指定初始化程序,则默认初始化该对象;如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值。

如果你为数组定义添加初始化,所有这些都会在窗口中显示,但是我们会将其留给另一个问题。

答案 1 :(得分:0)

让我们举个例子。

struct Object
{
    Object(){
        std::cout << "new object is created";
    }
}
Object object1; // contructor is called here
Object object2; // and here

std::list<Object> my_list = {object1,object2}; //step 2

在第2步,您不是要创建Object类型的新对象,而只是将它们插入my_list中。注意:在数组中插入会导致类似的行为。

关于第二个问题,原始类型是POD(即普通旧数据)类型,根据定义,它们不能具有用户定义的构造函数。

答案 2 :(得分:0)

是的,数组的所有元素都是默认初始化的(调用对象的默认构造函数,或者对于基元是不确定的(除非进行零初始化,在这种情况下基元设置为零)。)。 p>

但是,某些类没有指定默认构造函数。在这些情况下,如果没有初始化数组,就不能拥有它们的数组,因为数组不能默认初始化对象。您必须使用其他集合,例如vector