我认为我有一个基本的问题,即了解从类实例化对象或将其存储在变量/数组中。
我上课
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;
。有人可以解释一下为什么吗?
答案 0 :(得分:2)
撰写时:
void f() {
sensor sensorList[5]; // [1]
}
编译器将在堆栈中保留 有人可以解释一下为什么吗? 因为这几乎是您一直想要的,所以该语言是按照这种方式设计的。您仍然可以在C ++中将两个步骤分开,但是它需要使用不同的语法(放置 另一种选择是要求开发人员始终对这两个步骤保持明确,这将增加代码行(因此也增加了错误)。sizeof(sensor) * 5
个字节,并在第[1]行中调用默认构造函数sensor::sensor()
的五倍,在每个对象中调用一次。 >
new
),除非您正在设计容器,否则这种语法很少使用。
答案 1 :(得分:1)
sensor sensorList[5];
不仅保留内存,它还使用默认构造函数创建对象,并采用以下代码:
int main()
{
sensor sensorList[5];
std::cout << sensorList[3].isObject;
return 0;
}
对于C ++程序员来说,这肯定行得通,而且确实行得通。对象是使用类中唯一的对象(即默认构造函数)构造的,因此如果您没有构造函数,则输出将为1
,true
,它将使用自己的默认构造函数,在在这种情况下,将变量设置为其值isObject
将是0
,false
。