成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++基礎之析構函數的介紹

開發 后端
本文介紹的是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<<month<<\' \'<<da<<\',\'<<yr;  
  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卻沒有被刪除掉。

希望以上內容對析構函數的介紹,能夠給你帶來幫助。

責任編輯:于鐵 來源: 互聯網
相關推薦

2025-02-18 00:08:00

代碼C++RAII

2010-02-04 16:39:26

C++析構函數

2010-01-18 15:53:27

C++析構函數

2010-02-05 13:35:19

C++虛析構函數

2024-12-19 14:42:15

C++內存泄漏內存管理

2009-08-14 17:24:28

C#構造函數和析構函數

2011-07-14 23:27:05

C++引用

2009-09-03 13:14:55

C#構造函數C#析構函數

2009-07-30 15:24:13

C#析構函數C#構造函數

2011-06-15 09:47:14

C++

2011-07-14 17:17:21

C++指針

2011-07-14 17:02:09

C++指針

2024-12-11 16:00:00

C++函數編譯器

2021-12-11 19:02:03

函數C++對象

2010-01-20 14:25:56

函數調用

2025-04-11 07:50:00

虛析構函數C++開發

2011-06-17 16:09:04

freadfwrite

2010-07-20 09:52:27

Perl構造函數

2010-01-25 10:10:42

C++函數參數

2011-07-15 00:47:13

C++多態
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人av免费在线观看 | 亚洲精品视频免费观看 | 欧美视频一区 | 国产成人福利 | 国产精品国产精品国产专区不卡 | 欧美激情精品久久久久久变态 | 狠狠久久 | 国产精品色 | 国产精品毛片一区二区三区 | 一呦二呦三呦国产精品 | 国产精品免费一区二区三区四区 | 亚洲精品乱码久久久久久按摩观 | 午夜精品久久久久久久99黑人 | 欧美aaa级 | 精品久久久一区 | 国产精品国产成人国产三级 | 天天干天天想 | 国产福利91精品一区二区三区 | 国产精品一区二区视频 | 午夜寂寞福利视频 | 日韩成人高清在线 | 日韩在线免费视频 | 久久男人| 国产精品久久 | 视频在线一区二区 | 久久精品国产免费 | 亚洲www| 97国产精品| 久久国产视频网 | 一级在线观看 | 日韩国产三区 | 免费精品视频一区 | 日韩中文字幕视频 | 91精品国产91久久久久久 | av福利网站| 亚洲另类春色偷拍在线观看 | 中文字字幕一区二区三区四区五区 | 欧美成人一级视频 | 国产一级特黄视频 | 国产在线看片 | www日日日|