C++ 類建構函式和解構函式

gaopengtttt發表於2016-06-21
C++ 類建構函式和解構函式
1、建構函式:建構函式用於對物件的資料進行初始化,建構函式的和一般的方法(函式)有一些不同
             他的名字必須是類的名字,不能帶返回值。一般來說即使你不建立建構函式,也會
             為你建立預設的建構函式,但是預設的建構函式是什麼都不幹的。如:
             stu::stu(void){}
2、解構函式:解構函式用於對物件的記憶體進行回收,(如用malloc和new分配的記憶體空間)解構函式在
             物件消亡的時候會被自動呼叫,而不需要你手動呼叫,名稱為類名字前面加上~。一樣
             解構函式不能帶返回值,並且解構函式沒有引數,同樣如果你設定解構函式,也會
             為你預設建立解構函式,但是預設也是什麼都不做的。


另外需要注意的是:
1、建構函式可以有3種呼叫方法
--stu yl(1,"yanlei") 隱含呼叫,並且賦值
--stu yl;            隱含呼叫,可能函式過載了
--stu yl = stu(1,"yanlei") 顯示呼叫,並且賦值
注意呼叫stu yl(void)是不可以的這是一個返回stu類的函式原型
(C++11引入了其他的初始化方式這裡不討論)
2、建構函式,不能帶返回值。解構函式,不能帶引數和返回值
3、物件初始化後可以使用建構函式重新賦值如下:
   stu yl = stu(1,"yanlei");
   yl = stu(1,"gaopeng");
   但是此時使用的方法是建立一塊臨時空間,然後複製物件資料到物件,然後
   釋放,所以需要呼叫一次解構函式。
4、建構函式他的名字必須是類的名字,解構函式類名字前面加上~ 如:
   stu::stu(void);
   stu::~stu(void);
來看一段程式碼:

點選(此處)摺疊或開啟

  1. ::::::::::::::
  2. ct1.h
  3. ::::::::::::::
  4. /*************************************************************************
  5.     > File Name: ct1.h
  6.     > Author: gaopeng
  7.     > Mail: gaopp_200217@163.com
  8.     > Created Time: Mon 13 Jun 2016 01:54:32 AM CST
  9.  ************************************************************************/

  10. #include<iostream>
  11. using namespace std;

  12. typedef struct mem
  13. {
  14.         int t_sorce_;
  15.         const char *name_;
  16. } MEM;


  17. class stu
  18. {
  19.         private:
  20.                 int id_;
  21.                 MEM st_;

  22.     public:
  23.                  stu(int id,const char *name);//建構函式
  24.                  stu(void);//建構函式
  25.                 int set_src(int id,int a,int b,const char *name);
  26.                 int sh_src(void);
  27.                 const stu* check(const stu* info) const;
  28.                  ~stu(void); //解構函式
  29. };
  30. ::::::::::::::
  31. fu.cpp
  32. ::::::::::::::
  33. /*************************************************************************
  34.   > File Name: fu.cpp
  35.   > Author: gaopeng
  36.   > Mail: gaopp_200217@163.com
  37.   > Created Time: Mon 13 Jun 2016 02:02:26 AM CST
  38.  ************************************************************************/

  39. #include<iostream>
  40. #include "ct1.h"
  41. using namespace std;


  42. //建構函式使用函式過載
  43. stu::stu(int id,const char *name) //建構函式,不能帶返回值
  44. {
  45.         id_ = id;
  46.         st_.name_ = name;
  47.         st_.t_sorce_ = 0;
  48. }

  49. stu::stu(void) //建構函式,不能帶返回值
  50. {
  51.         static char name[20] = "gaopeng";
  52.         st_.name_ = name;
  53.         id_ = 0;
  54.         st_.t_sorce_ = 0;
  55. }

  56. stu::~stu(void) //解構函式,不能帶引數和返回值
  57. {
  58.         cout << "call destructor for name:" << st_.name_ <<endl;
  59. }

  60. int stu::set_src(int id,int a,int b,const char *name)
  61. {
  62.         id_ = id;
  63.         st_.t_sorce_ = a+b;
  64.         st_.name_ = name;
  65.         return 0;
  66. }

  67. int stu::sh_src(void)
  68. {
  69.         cout << id_ <<endl;
  70.         cout << st_.t_sorce_ <<endl;
  71.         cout << st_.name_ <<endl;
  72.         return 0;
  73. }

  74. const stu* stu::check(const stu* info) const
  75. {
  76.         if(info->id_ > id_ )
  77.         {
  78.                 return info;
  79.         }
  80.         else
  81.         {
  82.                 return this; // this 指標
  83.         }
  84. }
  85. ::::::::::::::
  86. main.cpp
  87. ::::::::::::::
  88. /*************************************************************************
  89.     > File Name: main.cpp
  90.     > Author: gaopeng
  91.     > Mail: gaopp_200217@163.com
  92.     > Created Time: Mon 13 Jun 2016 02:18:10 AM CST
  93.  ************************************************************************/

  94. #include<iostream>
  95. #include"ct1.h"
  96. using namespace std;


  97. int main(void)
  98. {
  99.         {
  100.         char a[20] = "yanlei";
  101.         stu yl(1,a); //stu::stu(int id,const char *name),方法1進行初始化,顯示初始化
  102.         yl.sh_src();
  103.         stu gp;// stu::stu(void) ,隱含初始化呼叫了過載函式stu()
  104.         gp.sh_src();
  105.         gp.set_src(2,10,20,"gaopeng1");
  106.         gp.sh_src();
  107.         stu gp2 = stu(3,"gaopeng2");//方法2進行初始化,方法2初始化可以有2個意思,意思1:初始化 意思2:如果已經初始化再次呼叫建立臨時內容然後COPY到gp2的方式,並且釋放臨時
  108. 記憶體呼叫解構函式
  109.         gp2 = stu(3,"gaopeng3"); //再次重構類資料,透過建立臨時內容然後COPY到gp2的方式,並且釋放臨時記憶體,所以呼叫了解構函式
  110.         gp2 = gp;
  111.         gp2.sh_src();
  112.         stu gp3;
  113.         cout << "gp3 resource:"<<endl;
  114.     gp3.sh_src();
  115.         gp3 = *(gp3.check(&gp2));
  116.         cout << "gp3 after check:"<<endl;
  117.         gp3.sh_src();
  118.    }
  119. }


其中都有詳細的解析,程式執行結果如下:
1
0
yanlei
0
0
gaopeng
2
30
gaopeng1
call destructor for name:gaopeng3
2
30
gaopeng1
gp3 resource:
0
0
gaopeng
gp3 after check:
2
30
gaopeng1
call destructor for name:gaopeng1
call destructor for name:gaopeng1
call destructor for name:gaopeng1
call destructor for name:yanlei

注意call destructor for name:gaopeng3就是臨時空間釋放呼叫的解構函式
並且注意this指標用法


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2120608/,如需轉載,請註明出處,否則將追究法律責任。

相關文章