2

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

4

3 回答 3

3

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

C++11 12.1.6:

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

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

类 X 的默认默认构造函数在以下情况下被定义为已删除:

  • X 是一个类似联合的类,它有一个带有非平凡默认构造函数的变体成员,
  • 任何没有大括号或等号初始化器的非静态数据成员都是引用类型,
  • 任何没有大括号或初始化器的 const 限定类型(或其数组)的非变体非静态数据成员都没有用户提供的默认构造函数,
  • X 是一个联合,它的所有变体成员都是 const 限定类型(或其数组),
  • X 是一个非联合类,并且任何匿名联合成员的所有成员都是 const 限定类型(或其数组),或
  • 任何直接或虚拟基类,或没有大括号或相等初始化器的非静态数据成员,具有类类型 M(或其数组),并且 M 没有应用于 M 的默认构造函数或重载决议 (13.3)构造函数会导致歧义或导致从默认的默认构造函数中删除或无法访问的函数。

例如,从上面可以看出以下程序是格式良好的:

struct X {
  X(int) {}
};

struct Y {
  X x;
};

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

于 2012-12-17T21:09:00.493 回答
0

不,没有这样的技巧,除非它是问题的确切措辞中的一个问题。

12.1p5:

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

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

于 2012-12-17T21:22:42.217 回答
0

Effective C++,Item 5:“这些函数 [ctor, dtor, copy ctor, copy assignment operator] 仅在需要时才生成 [...]”

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

于 2012-12-17T21:35:38.930 回答