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