析构函数概念
  (1) 函数名与类名类似,前面多了一个"~"符号(取反符)
  (2) 没有返回类型
  (3) 不能有参数
  (4) 不能被重载(这个好理解,因为没有参数,自然不能重载)
  (5) 如果没有定义析构函数,则编译器会自动生成一个默认的析构函数,函数体是空的。
  析构函数与对象数组
  把握一个原则,构造几个对象,要调用几次析构函数。
  拿上面的Test类来进行举例说明:
int main()
{
Test t[2] = {10,20}; //对象数组初始化,创建2个元素,即2个Test对象,分别传递初始值为10,20,是说调用的是带一个参数的构造函数。由于创建了2个对象,构造函数也调用了两次
Test *t2 = new Test(2); //仅创建一个对象,初始值为2,调用带一个参数的构造函数。
delete t2;  //调用一次析构函数。
Test *t3 = new Test[2]; //在堆上创建2个对象,无初始值,调用的是不带参数的默认构造函数,由于是2个对象,故调用了2次。
delete [] t3; //调用两次析构函数,还有释放内存操作。
}
  注意:析构函数可以被显式调用,但是当对象的生命周期结束后,系统还会再调用一次析构函数,这样造成了调用2次析构函数,如果在析构函数中含有delete操作,会出现问题。所以析构函数的显式调用比较少。STL源码中有用到析构函数的显式调用,这属于一些特殊用法。