据我所知的标准,一个简单的析构函数是其中的一个隐式声明和其类只有基座上,用琐碎析构函数非静态成员。 根据这个定义的递归性,在我看来,唯一的“递归停止用”条件是要找到一个基地或者非静态成员与非隐式声明的析构函数(即申报的用户)。 如果这是正确的,这应该是指一个平凡的析构函数是其中一个“没有做任何事情”,因此它会被宣布为(隐含的),但没有定义。 以另一种方式说它:这是正确的说,一个隐含的定义的析构函数(即“它做一些事情”)不能是微不足道按照标准定义

对不起的那种愚蠢的问题,但我想澄清事情有点在我的脑海...

有帮助吗?

解决方案

没有。的隐式定义的,琐碎的析构函数被定义琐碎:)在declare之间的差,并确定是啄,为了使编译器甚至一个析构函数是可用的,有必须始终声明。所以,如果你不提供一个,它会暗中提供一个。

但是,现在,它还将定义之一,如果所需要(如果这类类型的对象被销毁)。在任何情况下,它必须做一些事情:它需要调用它的所有成员和基类的析构函数。一个简单的例子示出隐式地定义的析构函数的效果:

struct a {
private:
    ~a();
};

struct bug {
    // note: can't be destructed
    a a_;
};

只要你尝试创建错误的本地对象,编译器会发出错误信号,因为它产生了错误析构函数,它试图拨打的未访问的析构函数的定义。

现在,我想析构函数的琐碎/构造大多采用把限制你的程序。让他们的不平凡的版本对象不能把工会,例如。在另一边,你可以删除有不完全类型的对象,只要它有一个平凡的析构函数。请注意,如果你的程序不能决定一个平凡的析构函数是否被实际定义,编译器允许省略定义它。这就是所谓的as-if规则。编译器有表现为,如果是符合标准 - 优化并不重要,只要他们不改变程序的意义。

其他提示

您措词是有点可惜。例如。当你用完了成员和基类课程的递归也结束。这些措辞的问题似乎也让你更糊涂了。

总之,所有隐式地声明的析构函数,无论它们是微不足道的,都当且仅当使用它们限定。 二手的是这里的特定术语。类型T的析构函数是使用每当为T对象的生命周期结束。

存在

琐碎的析构函数,因为C程序员把结构中联合。此代码应在C ++ remian合法的,所以一个简单的析构函数的概念被发明了C ++。所有C的结构具有微不足道的析构函数,当如C ++编译。

考虑这两个类:

class A {
};

class B {
private:
     A obj;
};

这两个类的析构函数隐含定义。然而,在同一时间,这两者都是由标准定义微不足道的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top