【问题标题】:C++ and destructors (nested classes and general questions)C++ 和析构函数(嵌套类和一般问题)
【发布时间】:2012-01-26 05:28:43
【问题描述】:
我正在用 C++ 实现二叉树。我对这门语言相当陌生,虽然我了解什么是结构和析构函数,但我不确定嵌套类/结构会发生什么。
在我的实现中,我的二进制节点有一个嵌套结构。这个结构是否需要它自己的析构函数,或者当二叉树本身的析构函数被调用时所有节点都会被删除。如果我将结构更改为类,答案是否会改变?
另外,有人告诉我,如果您在类中调用“new”,则需要在析构函数中调用“delete”。如果我在我的初始化列表中为一个类初始化一个数组(即 class:array({0})),我是否需要在我的析构函数中删除 [] 数组?
【问题讨论】:
标签:
c++
struct
destructor
【解决方案1】:
在另一个类(或结构)中嵌套一个类(或结构)对对象的生命周期没有影响。它所做的只是为类的名称提供范围,并访问封闭类中的私有成员。所以你的树节点不会因为嵌套在树类中而被自动销毁。
如果您希望在树本身被销毁时销毁树的节点,则需要确保树的析构函数能够做到这一点。如果您使用new 手动分配节点,请在析构函数中使用delete(或delete[])。或者,您可以使用 std::auto_ptr(或 C++11 中的 std::unique_ptr)之类的东西,它将在自己的析构函数中进行清理,因此您不必自己编写 delete 调用。
将结构更改为类对其运行时的行为没有影响。 C++ 中结构体和类之间的唯一区别是结构体隐式以public: 开头,而类体隐式以private: 开头。
【解决方案2】:
对于 C++ 来说,我们不必在类/结构中定义析构函数。
如果要将结构更改为类,则析构函数没有任何更改。
但是对于编程语言来说,如果我们用 new 调用内存,我们必须自己删除它。
如果您要定义嵌套类,那么在该类中创建析构函数也很好。
数组不需要使用for delete[]。