偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C++基礎之析構函數(shù)的介紹

開發(fā) 后端
本文介紹的是C++程序設計語言中的析構函數(shù),對于析構函數(shù)而言,我想我們并不陌生。希望對你有幫助,一起來看。

析構函數(shù)(destructor) 與構造函數(shù)相反,當對象脫離其作用域時(例如對象所在的函數(shù)已調(diào)用完畢),系統(tǒng)自動執(zhí)行析構函數(shù)。析構函數(shù)往往用來做“清理善后” 的工作(例如在建立對象時用new開辟了一片內(nèi)存空間,應在退出前在析構函數(shù)中用delete釋放)。

前面的一些例子都沒有說明析構函數(shù),這是因為所用到的類在結束時不需要做特別的清理工作。下面的程序給出了一新的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對象的構造函數(shù)中,首先用new運算符為字符串month動態(tài)分配了內(nèi)存,然后從內(nèi)部數(shù)組中把月份的名字拷貝給字符串指針month。
析構函數(shù)在刪除month指針時,可能會出現(xiàn)一些問題。當然從這個程序本身來看,沒什么麻煩;但是從設計一個類的角度來看,當Date類用于賦值時,就會出現(xiàn)問題。假設上面的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,并且在構造函數(shù)里用new運算符初始化過了。當birthday離開其作用域時,析構函數(shù)會調(diào)用delete運算符來釋放內(nèi)存。但同時,當today離開它的作用域時,析構函數(shù)同樣會對它進行釋放操作,而today里的month指針是birthday里的month指針的一個拷貝。析構函數(shù)對同一指針進行了兩次刪除操作,這會帶來不可預知的后果。

如果假設today是一個外部變量,而birthday是一個自變量。當birthday離開其作用域時,就已經(jīng)把對象today里的month指針刪除了。顯然這也是不正確的。
再假設有兩個初始化的Date變量,把其中一個的值賦值給另一個:

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

問題就更復雜了,當這兩個變量離開作用域時,birthday中的month的值已經(jīng)通過賦值傳遞給了today。而today中構造函數(shù)用new運算符給month的值卻因為賦值被覆蓋了。這樣,birthday中的month被刪除了兩次,而today中month卻沒有被刪除掉。

希望以上內(nèi)容對析構函數(shù)的介紹,能夠給你帶來幫助。

責任編輯:于鐵 來源: 互聯(lián)網(wǎng)
相關推薦

2025-02-18 00:08:00

代碼C++RAII

2010-01-18 15:53:27

C++析構函數(shù)

2010-02-04 16:39:26

C++析構函數(shù)

2010-02-05 13:35:19

C++虛析構函數(shù)

2024-12-19 14:42:15

C++內(nèi)存泄漏內(nèi)存管理

2009-08-14 17:24:28

C#構造函數(shù)和析構函數(shù)

2011-07-14 23:27:05

C++引用

2009-09-03 13:14:55

C#構造函數(shù)C#析構函數(shù)

2009-07-30 15:24:13

C#析構函數(shù)C#構造函數(shù)

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++函數(shù)編譯器

2021-12-11 19:02:03

函數(shù)C++對象

2010-01-20 14:25:56

函數(shù)調(diào)用

2025-04-11 07:50:00

虛析構函數(shù)C++開發(fā)

2010-07-20 09:52:27

Perl構造函數(shù)

2011-06-17 16:09:04

freadfwrite

2010-01-25 10:10:42

C++函數(shù)參數(shù)

2011-07-15 00:47:13

C++多態(tài)
點贊
收藏

51CTO技術棧公眾號