对象如何存储在数组中?

时间:2020-01-25 12:08:02

标签: c++

我认为我有一个基本的问题,即了解从类实例化对象或将其存储在变量/数组中。

我上课

class sensor{
  public:
  // Constructor
  sensor() {
    isObject = true; // Define that an object has been instantiated
  }

  bool isObject = false; // By default set this property to false
};

和一个数组

sensor sensorList[5];

我认为所定义的数组仅保留尽可能多的内存,以存储最大数量的可能元素(类型为sensor,因此这里的属性isObject为5 x 1字节)。

但是如果我Serial.println例如sensorList[1].isObject结果为1,因此该对象已经“实例化”(显然已调用了构造函数),而没有任何显式的sensor sensor1;。有人可以解释一下为什么吗?

2 个答案:

答案 0 :(得分:2)

撰写时:

void f() {
    sensor sensorList[5]; // [1]
}

编译器将在堆栈中保留sizeof(sensor) * 5个字节,并在第[1]行中调用默认构造函数sensor::sensor()的五倍,在每个对象中调用一次。 >

有人可以解释一下为什么吗?

因为这几乎是您一直想要的,所以该语言是按照这种方式设计的。您仍然可以在C ++中将两个步骤分开,但是它需要使用不同的语法(放置new),除非您正在设计容器,否则这种语法很少使用。

另一种选择是要求开发人员始终对这两个步骤保持明确,这将增加代码行(因此也增加了错误)。

答案 1 :(得分:1)

sensor sensorList[5];不仅保留内存,它还使用默认构造函数创建对象,并采用以下代码:

int main()
{
    sensor sensorList[5];
    std::cout << sensorList[3].isObject;
    return 0;
}

对于C ++程序员来说,这肯定行得通,而且确实行得通。对象是使用类中唯一的对象(即默认构造函数)构造的,因此如果您没有构造函数,则输出将为1true,它将使用自己的默认构造函数,在在这种情况下,将变量设置为其值isObject将是0false