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)为什么相同的规则不适用于默认的析构函数?
答案 0 :(得分:7)
我认为a)被你的引言充分明确地暗示了。
至于“为什么” - 非常简单:默认构造函数并不总是有意义的;如果没有办法压制它,这将大大削弱C ++。
对于c),没有析构函数的类(没有“默认”,只是普通的析构函数)根本没有意义。
答案 1 :(得分:1)
最短的答案是因为你为类Base声明了一个构造函数,没有创建默认构造函数(因此抑制)。您无法初始化Derived,因为Derived没有要在类Base上调用的默认构造函数。 (这是因为为您生成的派生的默认构造函数只能使用默认构造函数构造它的父类)
答案 2 :(得分:1)
a)标准是否在任何地方说出来 如果用户声明构造函数是 出现在一个类中,默认 构造函数(隐式)被抑制。 基本上是上述措辞 否定或是否再次暗示 :?)
是的,这就是意思
b) Why is it that way?
最有可能的是,如果你有一个用户定义的构造函数,这意味着需要做一些特殊的工作来初始化对象。在这种情况下禁用隐式生成的默认构造函数是有意义的,因为它可能不会执行任何特殊工作。
c) Why the same rules do not apply for the default destructor?
好吧,也许有意义的语言强制执行“三个规则”(如果你定义了一个复制构造函数,赋值运算符或析构函数,你可能需要实现所有三个),但它只是没有'吨。
也许理由是有几种方法来初始化类,但赋值和销毁通常以相同的方式工作(成员赋值,运行所有成员的析构函数)。