2
struct Base{
    Base(Base &){}        // suppress default constructor
};

struct Derived : Base{
};

int main(){
    Derived d;
}

显示的代码会出错,因为“Base”的默认构造函数(隐式)被抑制。确实,标准是 12.1 美元"If there is no user-declared constructor for class X, a default constructor is implicitly declared."

有三件事:

a)标准是否在任何地方说明如果用户声明的构造函数存在于类中,则默认构造函数(隐式)被抑制。基本上上面的措辞是负面的,还是再次暗示:)?

b) 为什么会这样?

c) 为什么相同的规则不适用于默认析构函数?

4

3 回答 3

7

我认为你的报价足够清楚地暗示了a)。

至于“为什么”——很简单:默认构造函数并不总是有意义的;如果没有办法抑制它,这将大大削弱 C++。

至于 c),没有析构函数的类(没有“默认”,只是普通的析构函数)根本没有意义。

于 2010-09-13T14:23:47.293 回答
1

最短的答案是因为您为类 Base 声明了构造函数,没有创建默认构造函数(因此被抑制)。您无法初始化 Derived,因为 Derived 没有可在类 Base 上调用的默认构造函数。(这是因为为你生成的默认构造函数只能用默认构造函数构造它的父类)

于 2010-09-13T14:24:35.713 回答
1

a)标准是否在任何地方说明如果用户声明的构造函数存在于类中,则默认构造函数(隐式)被抑制。基本上上面的措辞是负面的,还是再次暗示:)?

是的,就是这个意思

b) Why is it that way?

最有可能的是,如果您有一个用户定义的构造函数,这意味着需要做一些特殊的工作来初始化对象。在这种情况下禁用隐式生成的默认构造函数是有意义的,因为它可能不会做任何特殊工作。

c) Why the same rules do not apply for the default destructor?

好吧,也许语言强制执行“三规则”是有意义的(如果您定义了复制构造函数、赋值运算符或析构函数之一,您可能需要实现所有三个),但事实并非如此。

原因可能是初始化一个类有多种方法,但赋值和销毁通常以相同的方式工作(按成员赋值,运行所有成员的析构函数)。

于 2010-09-13T15:01:30.460 回答