没有构造函数的类(隐式或显式)

时间:2012-12-17 20:56:28

标签: c++

据我所知,如果你自己没有声明任何构造函数,你会得到一个隐式的默认构造函数。作为求职面试问题,我被问到一种情况,你没有声明构造函数,但仍然没有获得隐式默认构造函数。所以你最终得到一个没有任何构造函数的类。它应该是编译的代码,所以答案是没有一个成员变量,它本身不提供默认构造函数。有任何想法吗?搜索堆栈溢出和各种C ++站点没有发现任何东西。此外,作为一个提示,采访者说它与继承无关。

3 个答案:

答案 0 :(得分:3)

如果我对标准的读取是正确的,如果没有使用默认构造函数,它将不会被隐式定义。

C ++ 11 12.1.6:

  

当使用odr-used(3.2)创建其类类型(1.8)的对象或在第一次声明后显式默认为默认构造函数时,默认构造函数是默认的并且未定义为已删除。

此外,默认构造函数可以定义为“已删除”,C ++ 11 12.1.5:

  

一个   如果出现以下情况,则将类X的默认默认构造函数定义为已删除:

     
      
  • X是一个类似联合的类,其变体成员具有非平凡的默认构造函数,
  •   
  • 任何没有大括号或等号初始化程序的非静态数据成员都是引用类型
  •   
  • 任何const-quali fi ed类型(或其数组)的非变量非静态数据成员,没有brace-orequal-initializer,没有用户提供的默认构造函数,
  •   
  • X是一个联合体,它的所有变体成员都是const-quali fi ed类型(或其数组),
  •   
  • X是一个非联合类,任何匿名联合成员的所有成员都是const-quali fi ed类型   (或其阵列),或
  •   
  • 任何直接或虚拟基类,或没有大括号或等号初始值的非静态数据成员都有类   类型M(或其数组)并且M没有应用的默认构造函数或重载决策(13.3)   M的默认构造函数导致歧义或在删除或无法访问的函数中   默认的默认构造函数。
  •   

例如,从上面可以看出,以下程序格式正确:

struct X {
  X(int) {}
};

struct Y {
  X x;
};

这里Y没有隐式定义的默认构造函数,因为它既没有被使用也被定义为已删除。

答案 1 :(得分:0)

不,没有这样的伎俩,除非它是问题的确切措辞。

12.1p5:

  

如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值。

隐式声明的默认构造函数可能被定义为已删除,但它仍然是该类的成员。

答案 2 :(得分:0)

有效的C ++,第5项:“这些函数[ctor,dtor,copy ctor,copy assignment operator]仅在需要时生成[...]”

根据这个,如果你有一个没有声明ctors的类,并且你没有创建该类的任何实例,那么你的类根本就没有构造函数。