析构函数一般是自动调用的,但是某些情况下页需要显式调用,如出栈和入栈操作:
void C::push_back(const X& a) { // ... new(p) X{a}; // copy constr uct an X with the value a in address p // ... }
void C::pop_back() { // ... p−>˜X(); // destroy the X in address p }
也可以创建一个类,只能是显式调用析构函数,而不能隐式调用,如下:
class Nonlocal { public: // ... void destroy() { this−>˜Nonlocal(); } // explicit destruction private: // ... ˜Nonlocal(); //don’t destroy implicitly }; void user() { Nonlocal x; // error : cannot destroy a Nonlocal X∗ p = new Nonlocal; // OK // ... delete p; // error : cannot destroy a Nonlocal p.destroy(); //OK }
这个时候,析构函数私有化了,不能被外部调用。只能调用公有函数destroy()
虚析构函数,就是在虚构函数前面增加virtual关键字,通常用在有其他虚函数的类中。
class Shape { public: // ... virtual void draw() = 0; virtual ˜Shape(); }; class Circle { public: // ... void draw(); ˜Circle(); // overrides ˜Shape() // ... };
虚析构函数的作用是当继承的时候,可以调用正确的析构函数正确地释放资源。
如下面Shape *p其实是可以想象为作为一群派生类的接口,当调用p->draw()的时候,就会调用适当的派生类如Circle, triangle等。
这个时候调用析构函数的时候也需要利用虚函数机制,才能调用适当的虚函数,释放适当的资源。
void user(Shape∗*p) { p−>draw(); // invoke the appropriate draw() // ... delete p; // invoke the appropriate destructor };
某些书,如钱能的C++程序设计讲某些问题实在是讲的不好懂。讲的太绕了,无需深入去看。因为讲得并不好,也不实用。
其实就简单记得,所有基类的析构函数都记得定义为虚析构函数,前面加virtual。问题就解决了。