那么我们将如何编写类的析构函数呢?
析构函数可以的特性是在程序结束的时候逐一调用,那么正好与构造函数的情况是相反,属于互逆特性,所以定义析构函数因使用"~"符号(逻辑非运算符),表示它为腻构造函数,加上类名称来定义。
看如下代码:#include <iostream> #include <string> using namespace std; class Teacher { public: Teacher() { director = new char[10]; strcpy(director,"王大力"); //director = new string; // *director="王大力";//string情况赋值 } ~Teacher() { cout<<"释放堆区director内存空间1次"; delete[] director; cin.get(); } char *show(); protected: char *director; //string *director; }; char *Teacher::show() { return director; } class Student { public: Student() { number = 1; score = 100; } void show(); protected: int number; int score; Teacher teacher; }; void Student::show() { cout<<teacher.show()<<endl<<number<<endl<<score<<endl; } void main() { Student a; a.show(); Student b[5]; for(int i=0; i<sizeof(b)/sizeof(Student); i++) { b[i].show(); } cin.get(); } 上面的代码中我们为Teacher类添加了一个名为~Teacher()的析构函数用于清空堆内存。
建议大家编译运行代码观察调用情况,程序将在结束前也就是对象生命周期结束的时候自动调用~Teacher()
~Teache()中的delete[] director;就是清除堆内存的代码,这与我们前面一开始提到的。
name=input_name;//这样赋值是错误的
有直接的关系,因为delete操作符只能清空堆空间而不能清楚桟空间,如果强行清除栈空间内存的话将导致程序崩溃!
|