C++ 空类的默认构造函数是public。但是怎么做呢?

C++ 空类的默认构造函数是public。但是怎么做呢?,c++,constructor,private,default-constructor,public-method,C++,Constructor,Private,Default Constructor,Public Method,我有一个简单的问题: class my { }; my ob; 编译器允许我创建一个有意义的对象。而且,我知道,如果构造函数是私有的,就不能创建对象 在我看来,类中的所有内容都是private,但显然不是默认构造函数(因为它允许我创建对象,因为默认构造函数应该是public)。但让我困惑的是,课堂上没有public部分 那么,在这种情况下,它是否只创建了一个public节来放置一个默认构造函数 还是有别的事情发生而我的理由不正确 此外,在创建/访问对象时,如何在内部组织/跟踪公共、私有和受保护

我有一个简单的问题:

class my
{
};
my ob;
编译器允许我创建一个有意义的对象。而且,我知道,如果构造函数是私有的,就不能创建对象

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

那么,在这种情况下,它是否只创建了一个
public
节来放置一个默认构造函数

还是有别的事情发生而我的理由不正确

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


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

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


当然,这些构造函数相当简单——事实上,它可以用“nothing”替换,因为构造一个空类将什么也做不了

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


private、protected和public的概念仅与编译器相关。它们没有任何意义,在运行时也不会被跟踪。

< p>如果你自己不声明任何构造函数,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; };

编译器将生成默认构造函数作为
inline public
,如果用户未定义该构造函数,则其相关部分为
12.1/5

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


通常,默认情况下,编译器在创建对象时生成4个东西

  • 默认构造函数

  • 复制构造函数

  • 复制赋值运算符

  • 析构函数

  • 例如:

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

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

    编译器提供的构造函数、析构函数和赋值运算符是公共的。你必须积极地做一些事情来阻止他们。