C++未初始化类数组

C++未初始化类数组,c++,class,constructor,C++,Class,Constructor,在我的研究中,我了解到,如果要阻止用户调用类的默认构造函数,可以将其设置为私有: class Person { public: Person(const Person&); ~Person(); private: Person(); //Any call to this will cause a compiler error. }; 我不明白的是,当我创建类的未初始化数组时,它会给我一个语法错误,说它是私有的: Person * ptr; //Works just f

在我的研究中,我了解到,如果要阻止用户调用类的默认构造函数,可以将其设置为私有:

class Person
{
public:
  Person(const Person&);
  ~Person();
private:
  Person();  //Any call to this will cause a compiler error.
};
我不明白的是,当我创建类的未初始化数组时,它会给我一个语法错误,说它是私有的:

Person * ptr;   //Works just fine.
Person arr[1];  //Syntax error: 'Person::Person()' is private

这让我相信,它会在创建数组时尝试调用默认构造函数。但这对我来说没有任何意义,因为我实际上没有创建任何真实的对象。

您没有创建未初始化的数组。您正在创建一个Person对象数组。它们必须以某种方式初始化。如果不存在构造函数,那么它将返回默认的初始化规则,这可能会给某些成员留下未指定的值。但是当声明构造函数时,必须使用它


< C++中没有一个未初始化的对象。对象在构造时存在,并且在构造期间,根据对象的外观以某种方式对其进行初始化。

这两行之间存在差异

Person * ptr;   //Works just fine.
Person arr[1]; 
在第一行中,您刚刚声明了一个指针,但没有分配内存。因此尚未调用构造函数。因此,它不会给出任何错误

如果你想说得更清楚,试试这个

ptr = new Person();
在第二行中,您正在实例化一个类对象数组,它将调用costructor。因此,您得到了错误

Person * ptr;
这不会创建Person对象。它只是一个具有未初始化值的指针

Person * ptr;   //Works just fine. 
Person arr[1];  //Syntax error: 'Person::Person()' is private 
这会让我相信它试图给 创建数组时的默认构造函数。但这并不意味着 对我来说没有任何意义,因为我实际上没有创造任何真实的物体

这是你的错误。在第二个示例中,失败的一个示例是创建一个真实对象。你在定义一系列的人?!使用一个元素/对象

因此,您正在创建一个对象以进入该数组

还记得创建对象时会发生什么吗? 调用构造函数,如果没有合适的已定义构造函数,编译器会做什么 是吗

它使用默认值,但不能使用,因为它是私有的

Person * ptr; is a pointer and it is not initialized
Person arr[1]; is an array of Person and for each element it is called Person()
as a default constructor

因为覆盖了Person,编译器将使用Person构造函数,并且因为它是私有的,所以它会给您和错误,因为您在声明Person arr[1]时不能从类外部调用私有方法你用一个元素创建数组,并用默认的构造函数调用它,它是私有的,用人*pTR你只需要一个指针。你知道指针与人的区别和包含类型的元素的数组之间的区别吗?C++中没有初始化对象,这是一个解脱,因为标准在[conv.lval]中讨论了它们,它们是坏消息;-当然,用你的术语来说,它的意思是一个左值表达式,指的是一个尚未成为对象的内存区域。你的条件更精确,他们应该让你帮助起草下一份。这是真的。是的,这是一个稍微简化的版本。我希望它传达了正确的想法,即使措辞与标准所说的不同。