程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++析構函數不同使用方式

C++析構函數不同使用方式

編輯:C++入門知識

C++編程語言可以被看做是C語言的升級版本,它的許多應用方法都與其他編程語言有相似之處。不過在一些特定的使用方法中,還是有些不同的應用方式。在這裡我們就先來了解一下C++析構函數的一些特殊應用方式。

C#中的終結器(也就是析構函數)類似於C++析構函數,但是由於編譯時無法確定終結器的執行時機,因此兩者實際上存在相當大的區別。垃圾回收器調用C#終結器的時機是在對象上一次使用之後,但是在應用程序關閉之前的某個時間。相反,只要一個對象(而非指針)超出范圍,(此處的范圍指作用域),就會自動調用C++析構函數。對此我還真有點懷疑,於是分別寫了C++與C#的代碼看一下情況是否真的是這樣。

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. namespace ConsoleApplication1  
  6. {  
  7. class Program  
  8. {  
  9. static void Main(string[] args)  
  10. {  
  11. test();  
  12. }  
  13. static void test()  
  14. {  
  15. myPeople p = new myPeople();  
  16. Console.WriteLine("Complate");  
  17. }  
  18. }  
  19. class myPeople  
  20. {  
  21. public myPeople()  
  22. {  
  23. Console.WriteLine("Construct");  
  24. }  
  25. ~myPeople()  
  26. {  
  27. Console.WriteLine("Dispose");  
  28. }  
  29. }  

於是我分別在各個方法中插入斷點然後F5開始逐步調試,我發現沒有myPeople的調用是在test()方法執行完畢後,Main()方法結束執行器調用的。再看C++

  1. #include<iostream> 
  2. #include<string> 
  3. using namespace std;  
  4. class myPeople  
  5. {  
  6. public :  
  7. myPeople()  
  8. {  
  9. cout<<"Construct"<<std::endl;  
  10. }  
  11. ~myPeople()  
  12. {  
  13. cout<<"Dispose"<<std::endl;  
  14. }  
  15. };  
  16. void myMethod()  
  17. {  
  18. myPeople my;;  
  19. cout<<"Complate"<<std::endl;  
  20. }  
  21. int main()  
  22. {  
  23. myMethod();  

通過上面的執行過程就會發現確實如同本質論作者說的那樣,C#調用終結器與C++析構函數區別是相當大的。C#清理一個類的資源並不是確定的,而C++類資源的釋放是該類超出作用域之後便開始調用析構函數。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved