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);
來看一段代碼:
- ::::::::::::::
- ct1.h
- ::::::::::::::
- /*************************************************************************
- > File Name: ct1.h
- > Author: gaopeng
- > Mail: [email protected]
- > Created Time: Mon 13 Jun 2016 01:54:32 AM CST
- ************************************************************************/
- #include<iostream>
- using namespace std;
- typedef struct mem
- {
- int t_sorce_;
- const char *name_;
- } MEM;
- class stu
- {
- private:
- int id_;
- MEM st_;
- public:
- stu(int id,const char *name);//構造函數
- stu(void);//構造函數
- int set_src(int id,int a,int b,const char *name);
- int sh_src(void);
- const stu* check(const stu* info) const;
- ~stu(void); //析構函數
- };
- ::::::::::::::
- fu.cpp
- ::::::::::::::
- /*************************************************************************
- > File Name: fu.cpp
- > Author: gaopeng
- > Mail: [email protected]
- > Created Time: Mon 13 Jun 2016 02:02:26 AM CST
- ************************************************************************/
- #include<iostream>
- #include "ct1.h"
- using namespace std;
- //構造函數使用函數重載
- stu::stu(int id,const char *name) //構造函數,不能帶返回值
- {
- id_ = id;
- st_.name_ = name;
- st_.t_sorce_ = 0;
- }
- stu::stu(void) //構造函數,不能帶返回值
- {
- static char name[20] = "gaopeng";
- st_.name_ = name;
- id_ = 0;
- st_.t_sorce_ = 0;
- }
- stu::~stu(void) //析構函數,不能帶參數和返回值
- {
- cout << "call destructor for name:" << st_.name_ <<endl;
- }
- int stu::set_src(int id,int a,int b,const char *name)
- {
- id_ = id;
- st_.t_sorce_ = a+b;
- st_.name_ = name;
- return 0;
- }
- int stu::sh_src(void)
- {
- cout << id_ <<endl;
- cout << st_.t_sorce_ <<endl;
- cout << st_.name_ <<endl;
- return 0;
- }
- const stu* stu::check(const stu* info) const
- {
- if(info->id_ > id_ )
- {
- return info;
- }
- else
- {
- return this; // this 指針
- }
- }
- ::::::::::::::
- main.cpp
- ::::::::::::::
- /*************************************************************************
- > File Name: main.cpp
- > Author: gaopeng
- > Mail: [email protected]
- > Created Time: Mon 13 Jun 2016 02:18:10 AM CST
- ************************************************************************/
- #include<iostream>
- #include"ct1.h"
- using namespace std;
- int main(void)
- {
- {
- char a[20] = "yanlei";
- stu yl(1,a); //stu::stu(int id,const char *name),方法1進行初始化,顯示初始化
- yl.sh_src();
- stu gp;// stu::stu(void) ,隱含初始化調用了重載函數stu()
- gp.sh_src();
- gp.set_src(2,10,20,"gaopeng1");
- gp.sh_src();
- stu gp2 = stu(3,"gaopeng2");//方法2進行初始化,方法2初始化可以有2個意思,意思1:初始化 意思2:如果已經初始化再次調用建立臨時內容然後COPY到gp2的方式,並且釋放臨時
- 內存調用析構函數
- gp2 = stu(3,"gaopeng3"); //再次重構類數據,通過建立臨時內容然後COPY到gp2的方式,並且釋放臨時內存,所以調用了析構函數
- gp2 = gp;
- gp2.sh_src();
- stu gp3;
- cout << "gp3 resource:"<<endl;
- gp3.sh_src();
- gp3 = *(gp3.check(&gp2));
- cout << "gp3 after check:"<<endl;
- gp3.sh_src();
- }
- }
其中都有詳細的解析,程序執行結果如下:
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指針用法