2010-09-13 183 views
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."默认构造函数

有三件事情:

一)是否标准说任何地方 如果用户声明的构造是 存在于类,默认 构造函数(隐含的)被压制。它基本上是否定的上述措词,或者是否再次暗示:)?

b)为什么这样?

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

+1

这里有一些困惑。 “默认构造函数”技术上指的是没有参数的构造函数,并且没有对应的析构函数。编译器抱怨,因为你不能声明一个没有默认(无参数)构造函数的未初始化变量。有时候“默认构造函数”用于系统提供的,这在英文用法上是合理的,但完全不同。如果你没有自己定义的话,标准指的是“隐式声明的”构造函数。 – 2010-09-13 14:33:01

+0

为什么在你的例子中你显示继承?它与你的问题有什么联系? – 2010-09-13 15:04:22

回答

1

一)是否标准说任何地方 如果用户声明的构造是 存在于类,默认的 构造函数(隐式)被抑制。 它基本上是上述措辞 消极或还是暗示 :)?

是的,这是意义

b) Why is it that way? 

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

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

好吧,也许这将是有意义的强制执行“三法则”(如果你定义拷贝构造函数,赋值运算符或析构函数,那么你需要实现三个之一)的语言,但它只是没有。

也许理由是有几种方法来初始化一个类,但赋值和销毁通常以同样的方式工作(成员赋值,运行所有成员的析构函数)。

7

我认为a)已足够明确地暗示您的报价。

至于“为什么” - 很简单:默认的构造函数并不总是有意义的;如果没有办法压制它,这会大大削弱C++。对于c),没有析构函数的类(没有“default”,只是简单的析构函数)根本没有意义。

1

最简短的答案是因为您声明了类Base的构造函数,因此不会创建默认构造函数(因此为抑制)。你不能初始化Derived,因为Derived没有默认的构造函数来调用class Base。 (这是因为产生衍生的默认构造函数,你只能建造它的默认构造父类)