12

我有一个简单的问题:

class my
{
};
my ob;

编译器允许我创建一个有意义的对象。而且,我知道你不能在构造函数是私有的地方创建对象。

在我看来,类中的所有内容都是private但显然不是默认构造函数(因为它允许我创建对象,因为默认构造函数应该是public)。但让我感到困惑的是,课堂上没有public部分。

那么,public在这种情况下,它是否创建一个部分只是为了在其下放置一个默认构造函数?

还是发生了其他事情而我的理由不正确?

此外,当创建/访问对象时,如何在内部组织/跟踪公共、私有和受保护的访问?

我得到了这个问题,因为直到现在我从未创建过空类的对象。

4

5 回答 5

9

如果您自己不声明任何构造函数,C++ 编译器将始终为您生成一个公共的普通构造函数。不仅如此,它还将隐式创建一个公共复制构造函数和赋值运算符。

从 C++11 标准 12.1.5 开始:

如果类 X 没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认构造函数。隐式声明的默认构造函数是其类的内联公共成员。

和 12.8.7、12.8.11:

如果类定义没有显式声明复制构造函数,则隐式声明。[...] 隐式声明的副本 [...] 构造函数是其类的内联公共成员。

最后是 12.8.18、12.8.20、12.8.22:

如果类定义没有显式声明复制赋值运算符,则隐式声明一个。[...] 如果类 X 的定义没有显式声明移动赋值运算符,则将隐式声明 [...]。隐式声明的复制/移动赋值运算符是其类的内联公共成员。

请注意,仅在某些情况下才会生成移动赋值运算符,这超出了本问题的范围,有关详细信息,请参阅 12.8.20。

如果你想要一个私有构造函数,你必须自己声明它:

class my { my() {} };

如果您想阻止复制构造函数或赋值运算符的生成,您可以声明但不实现它们:

class my { my(my const &); };

或者,从 C++11 开始,显式删除它们:

class my { my(my const &) = delete; };
于 2013-08-06T13:13:50.793 回答
1

编译器将生成默认构造函数,就inline public好像它不是由用户定义的一样,相关部分C++ draft standard12.1/5

如果类 X 没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认 (8.4)。隐式声明的默认构造函数是其类的内联公共成员。

于 2013-08-06T13:16:06.800 回答
1

是的,编译器将生成默认构造函数和默认复制构造函数以及默认赋值运算符作为“公共” - 因为其他任何东西都会使类变得无用......

当然,那些构造函数会相当简单——事实上,它可以被替换为“nothing”,因为构造一个空类将什么都不做。

于 2013-08-06T13:11:26.023 回答
1

编译器生成的默认构造函数(和其他运算符)自动公开。如果您希望默认构造函数是私有的,那么您需要自己指定它,我在您的类的私有部分中声明它。

私有、受保护和公共的概念仅与编译器相关。它们没有任何意义,并且在运行时不会被跟踪。

于 2013-08-06T13:11:34.743 回答
0

通常编译器在创建对象时默认生成 4 个东西。

  1. 默认构造函数

  2. 复制构造函数

  3. 复制赋值运算符

  4. 析构函数

例如:

class First {

      First(){}                        //default constructor
      First(const First &){}           //copy constructor
      First& operator=(const First&){  //Copy assignment operator
              return *this;
      }
      ~First(){}                       //Destructor  
}   

这些是隐式内联公共成员,除非没有用户声明的构造函数。

于 2018-12-26T06:32:09.977 回答