C++基础之析构函数的介绍

析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

前面的一些例子都没有说明析构函数,这是因为所用到的类在结束时不需要做特别的清理工作。下面的程序给出了一新的Date类,其中包括一个字符串指针,用来表示月份。

 
 
  1. #include \"iostream.h\"  
  2. #include \"string.h\"  
  3.  
  4. class Date  
  5. {  
  6. int mo,da,yr;  
  7. char *month;  
  8. public:  
  9. Date(int m=0, int d=0, int y=0);  
  10. ~Date();  
  11. void display() const;  
  12. };  
  13.  
  14. Date::Date(int m,int d,int y)  
  15. {  
  16. static char *mos[] =  
  17. {  
  18. \"January\",\"February\",\"March\",\"April\",\"May\",\"June\",  
  19. \"July\",\"August\",\"September\",\"October\",\"November\",\"December\" 
  20. };  
  21. mo=m; da=d; yr=y;  
  22. if(m!=0)  
  23. {  
  24. month=new char[strlen(mos[m-1])+1];  
  25. strcpy(month, mos[m-1]);  
  26. }  
  27. else month = 0;  
  28. }  
  29.  
  30. Date::~Date()  
  31. {  
  32. delete [] month;  
  33. }  
  34.  
  35. void Date::display() const 
  36. {  
  37. if(month!=0) cout<
  38. }  
  39.  
  40. int main()  
  41. {  
  42. Date birthday(8,11,1979);  
  43. birthday.display();  
  44. return 0;  

在Date对象的构造函数中,首先用new运算符为字符串month动态分配了内存,然后从内部数组中把月份的名字拷贝给字符串指针month。
析构函数在删除month指针时,可能会出现一些问题。当然从这个程序本身来看,没什么麻烦;但是从设计一个类的角度来看,当Date类用于赋值时,就会出现问题。假设上面的main()修改为“

 
 
  1. int main()  
  2. {  
  3. Date birthday(8,11,1979);  
  4.  
  5. Date today;  
  6. today=birthday;  
  7.  
  8. birthday.display();  
  9. return 0;  

这会生成一个名为today的空的Date型变量,并且把birthday值赋给它。如果不特别通知编译器,它会简单的认为类的赋值就是成员对成员的拷贝。在上面的程序中,变量birthday有一个字符型指针month,并且在构造函数里用new运算符初始化过了。当birthday离开其作用域时,析构函数会调用delete运算符来释放内存。但同时,当today离开它的作用域时,析构函数同样会对它进行释放操作,而today里的month指针是birthday里的month指针的一个拷贝。析构函数对同一指针进行了两次删除操作,这会带来不可预知的后果。

如果假设today是一个外部变量,而birthday是一个自变量。当birthday离开其作用域时,就已经把对象today里的month指针删除了。显然这也是不正确的。
再假设有两个初始化的Date变量,把其中一个的值赋值给另一个:

 
 
  1. Date birthday(8,11,1979);  
  2. Date today(12,29,2003);  
  3. today=birthday; 

问题就更复杂了,当这两个变量离开作用域时,birthday中的month的值已经通过赋值传递给了today。而today中构造函数用new运算符给month的值却因为赋值被覆盖了。这样,birthday中的month被删除了两次,而today中month却没有被删除掉。

希望以上内容对析构函数的介绍,能够给你带来帮助。

当前题目:C++基础之析构函数的介绍
网站链接:http://www.shufengxianlan.com/qtweb/news46/379496.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联