2013-08-06 24 views
7

我有一个简单的问题:空类的默认构造函数是公共的。但是如何?

class my 
{ 
}; 
my ob; 

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

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

那么,它是否创建了一个public部分,仅在此情况下将默认构造函数置于其下?

或者还有其他事情正在发生,我的理由不正确?

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

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

+1

编译器提供的构造函数,析构函数和赋值运算符都是'public'。你必须积极地做些事情来阻止他们。 – juanchopanza

回答

6

如果你自己没有声明任何构造函数,C++编译器将总是为你生成一个公共的简单构造函数。除此之外,它也会隐式地创建一个公共拷贝构造函数和赋值运算符。

从C++ 11标准12.1.5:

如果 存在用于类X没有用户声明的构造,不具有参数的构造是隐式声明 功能为缺省。隐式声明的默认构造函数是其类的内联公共成员。

和12.8.7,11年8月12日:

如果类定义不明确声明拷贝构造函数,一个是隐式声明。 [...]隐式声明的副本构造函数是其类的内联公共成员。

最后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

是,编译器会产生默认的构造函数和默认的拷贝构造函数和默认的赋值运算符为“公共” - 因为别的会使类,而没用......

当然,这些构造会相当简单 - 事实上,它可以替换为“无”,因为构建一个空的类将什么都不做。

1

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

private,protected和public的概念只与编译器有关。它们没有意义,并且在运行时不被跟踪。

1

ŧ他的编译器会生成如果它不是由用户定义的默认构造函数inline public,该C++ draft standard的相关部分是12.1/5

如果对于X类无用户声明的构造函数,无参数的构造函数隐含地宣布为默认(8.4)。隐式声明的默认构造函数是其类的内联公共成员。

相关问题