當前位置:
首頁 > 知識 > 複製構造函數與析構函數

複製構造函數與析構函數

複製構造函數:

複製構造函數是一種特殊的構造函數,其形參為本類的對象引用,作用是用一個已存在的對象去初始化同類型的新對象

如果沒有為類聲明拷貝初始化構造函數,則編譯器自己生成一個隱含的複製構造函數,這個構造函數會用作為初始值的對象的每個數據成員的值,初始化將要建立的對象的對應數據成員,在很多情況下已經很完美了,所以不用自己聲明複製構造函數

析構函數:

相當於是「反·構造函數」,完成對象被刪除前的一些清理工作

除了不能有返回類型,不能return以外,還不能有參數傳遞

在對象的生存期結束的時刻系統自動調用它,然後再釋放此對象所屬的空間

如果程序中未聲明析構函數,編譯器將自動產生一個默認的析構函數,其函數體為空

樣例:(代碼中有注釋)

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. class Point
  5. {
  6. public:
  7. Point(int x, int y); //構造函數
  8. Point(const Point &b); //複製構造函數,使用const是為了避免在初始化新對象過程中把原有的對象給改了
  9. ~Point(); //析構函數
  10. void Show();
  11. private:
  12. int *x, *y;
  13. };
  14. Point::Point(int a, int b)
  15. {
  16. x = new int;
  17. y = new int;
  18. *x = a, *y = b;
  19. }
  20. Point::Point(const Point &b)
  21. {
  22. cout<<"調用複製構造函數,為指針x和y申請內存"<<endl;
  23. x = new int;
  24. y = new int;
  25. *x = *b.x, *y = *b.y;
  26. }
  27. Point::~Point(void)
  28. {
  29. cout<<"調用析構函數,釋放內存"<<endl;
  30. delete x;
  31. delete y;
  32. }
  33. void Point::Show()
  34. {
  35. cout<<"("<<*x<<", "<<*y<<")"<<endl;
  36. }
  37. void Display(Point a) //形實結合時,即用實參去初始化實參時,也會發生一次複製構造
  38. {
  39. a.Show();
  40. // 注意如果函數的返回值是類的對象,函數執行完成返回主調函數時,將使用return語句中的對象初始化一個臨時無名對象,傳遞給主調函數,此時也會發生複製構造
  41. }
  42. int main(void)
  43. {
  44. Point p(3, 5);
  45. Point q(p);
  46. Display(p), Display(q);
  47. return 0;
  48. }
  49. /*
  50. 調用複製構造函數,為指針x和y申請內存
  51. 調用複製構造函數,為指針x和y申請內存
  52. (3, 5)
  53. 調用析構函數,釋放內存
  54. 調用複製構造函數,為指針x和y申請內存
  55. (3, 5)
  56. 調用析構函數,釋放內存
  57. 調用析構函數,釋放內存
  58. 調用析構函數,釋放內存
  59. */

複製構造函數與析構函數

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

ubuntu怎麼使用命令搜索軟體源中的軟體
程序員如何快速搭建個性化主頁

TAG:程序員小新人學習 |