一个空类的默认构造函数是公共的。但是为什么?

12

我有一个简单的问题:

class my
{
};
my ob;

编译器允许我创建有意义的对象。但是,我知道当构造函数为私有时,无法创建对象。

在我的看来,类内的所有内容都是 private ,但显然不包括默认构造函数(因为它允许我按照默认构造函数的方式创建对象,应该是 public 的)。但令我困惑的是,这个类中没有 public 部分。

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

或者还有其他事情发生,我的推理是错误的吗?

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

我之所以提出这个问题,是因为我之前从未创建过一个空类的对象。


1
编译器提供的构造函数、析构函数和赋值运算符都是“公共的”。如果要禁用它们,你必须积极地采取措施。 - juanchopanza
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; };

1
是的,编译器会生成默认构造函数和默认复制构造函数以及默认赋值运算符作为"public" - 因为其他任何选择都会使类变得相当无用...
当然,这些构造函数会相当简单 - 实际上,它可以被替换为"nothing",因为构建一个空类将不执行任何操作。

1
编译器生成的默认构造函数(以及其他运算符)自动为公共。如果您想将默认构造函数设为私有,则需要在类的私有部分中声明来指定它。
私有、受保护和公共的概念仅与编译器相关,它们没有任何意义,并且在运行时不被跟踪。

1

如果用户没有为类X声明构造函数,则编译器将生成默认构造函数,其类型为内联公共C ++草案标准 的相关部分是12.1/5:

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


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  
}   

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接