0

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

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

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

4

5 回答 5

8

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

在 C++ 中没有“未初始化”对象之类的东西。对象在构造时就存在,在构造过程中,它会以某种方式被初始化,具体取决于对象的外观。

于 2012-06-15T09:48:45.280 回答
4
Person * ptr;   //Works just fine. 
Person arr[1];  //Syntax error: 'Person::Person()' is private 

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

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

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

记住当一个对象被创建时——会发生什么?调用构造函数,如果没有合适的定义构造函数,编译器会做什么?

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

于 2012-06-15T09:55:53.340 回答
1
Person * ptr;

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

于 2012-06-15T09:52:47.773 回答
1
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() 构造函数,并且因为它是私有的,所以它会给您和错误,因为您不能从类外部调用私有方法

于 2012-06-15T09:57:37.113 回答
0

2行之间有区别

Person * ptr;   //Works just fine.
Person arr[1]; 

在第一行中,您刚刚声明了一个指针,但没有分配内存。所以构造函数还没有被调用。因此它不会给出任何错误。

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

ptr = new Person();

在第二行中,您将实例化一个类对象数组,该数组将调用 costructor。因此你得到了错误

于 2012-06-15T09:51:54.400 回答