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
}
这些是隐式内联公共成员,除非没有用户声明的构造函数 编译器提供的构造函数、析构函数和赋值运算符是公共的。你必须积极地做一些事情来阻止他们。