Empty Class的默认构造函数是public。但是怎么样?

时间:2013-08-06 13:08:20

标签: c++ constructor private default-constructor public-method

我有一个简单的问题:

class my
{
};
my ob;

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:6)

如果您没有自己声明任何构造函数,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 :(得分:1)

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

当然,那些构造函数会相当简单 - 事实上,它可以替换为“nothing”,因为构造一个空类将不会做任何事情。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

如果用户没有定义,编译器会生成默认构造函数inline publicC++ draft standard的相关部分为12.1/5

  

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

答案 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  
}   

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