在C ++中:为什么在声明对象数组时会调用构造函数?

时间:2015-11-15 13:05:30

标签: c++ arrays

MyClass mc2[] = { MyClass(),  MyClass() };  //this calls the constructor twice
MyClass mc1[4]; // this calls the constructor 4 times. Why?

所以,我的问题是:为什么没有初始化的对象数组的声明导致默认构造函数被调用?

2 个答案:

答案 0 :(得分:8)

在C ++中,大小为4的MyClass数组是四个实际对象。它有点像包含该类型的四个成员的结构,当然您使用不同的语法访问成员,并且还存在其他技术差异。

因此,定义该数组会导致构造4个对象的原因相同(并且在大致相同的情况下),因为定义该类型的一个对象会导致构造一个对象。

将这种状态与另一种编程语言进行对比:在Java中,大小为4的MyClass数组只有四个指针,允许为空。因此,创建它不会创建任何MyClass个对象。

答案 1 :(得分:5)

  

所以,我的问题是:为什么声明一个对象数组   没有初始化会导致调用默认构造函数吗?

因为这就是C ++的工作方式。

MyClass mc1[4]几乎就像您创建了四个不同的MyClass对象:

MyClass mc1_1;
MyClass mc1_2;
MyClass mc1_3;
MyClass mc1_4;

在具有默认构造函数的类中,这很自然意味着默认构造函数用于初始化每个对象。