析构函数的特点:
1、析构函数与类名相同,但它前面必须加上波浪号~2、析构函数不返回任何值,在定义析构函数时,是不能说明它的类型的,甚至说明void类型也不能3、析构函数没有参数,因此不能被重载。一个类可以有多个构造函数,但是只能有一个析构函数 4、撤销对象时,编译系统会自动调用析构函数//例3.13 含有析构函数和构造函数的Conplex类 #include#include using namespace std;class Complex{ public: Complex(double r=0.0,double i=0.0); //声明默认参数的构造函数 ~Complex(); //声明析构函数 double abscomplex(); //声明abscomplex函数 private: double real; double imag; }; Complex::Complex(double r,double i) //定义构造函数 { real = r; imag = i; cout<<"Constructor called"<
说明:
(1)每个类必须有一个析构函数。若没有显式的为一个类定义析构函数,则编译系统会自动生成一个默认的析构函数。例如,编译系统为类Complex生成类似如下述形式的默认析构函数:Complex::~Complex(){}类似于系统自动生成的默认构造函数,这个自动生成的默认析构函数的函数体也是空的,但是它能完成释放对象所占的内存空间的任务。对于大多数类而言,这个默认析构函数就能满足要求。但是,如果在一个对象撤销之前需求完成另外一些处理工作的话,则应该显示地定义析构函数,例如:class String_data{ public: String_data(char *s) //构造函数 { str = new char[strlen(s)+1]; //用运算符new为字符串str动态的分配一个存储空间 strcpy(str,s); } ~String_data(); //析构函数 { delete str; //用delete运算符释放动态分配的存储空间 } void get_info(char *); void sent_info(char *); private: char *str; };
这是构造函数和析构函数常见的用法,即在构造函数中用new运算符为字符串分配存储空间
,最后在析构函数中通过delete运算符释放已分配的存储空间。(2)除了在主函数结束(或调用exit函数)时,对象被撤销,系统会自动调用析构函数函数
外,在以下的情况下,析构函数也会被调用:a、如果一个对象被定义在函数体内,则当这个函数被调用结束时,该对象将释放,析构函数被自动调用。b、若一个对象是使用new运算符动态创建的,在使用delete运算符释放它时,delete会自动调用析构函数。#includeusing namespace std;class String_data{ public: String_data(char *s) //构造函数 { str = new char[strlen(s)+1]; //用运算符new为字符串str动态的分配一个存储空间 strcpy(str,s); } ~String_data() //析构函数 { cout<<"Destructor"<