C++ 類建構函式和解構函式
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
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指標用法
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: gaopp_200217@163.com
-
> 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: gaopp_200217@163.com
-
> 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: gaopp_200217@163.com
-
> 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指標用法
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2120608/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++ 建構函式和解構函式C++函式
- 類的建構函式和解構函式函式
- C++入門記-建構函式和解構函式C++函式
- [C++]顯示呼叫建構函式和解構函式C++函式
- C/C++——建構函式、複製建構函式和解構函式的執行時刻C++函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- C++語言之結構體、類、建構函式、拷貝建構函式C++結構體函式
- 【C++】建構函式C++函式
- C++建構函式C++函式
- PHP 手冊 (類與物件) 學習筆記五:建構函式和解構函式PHP物件筆記函式
- Objective-C學習筆記---建構函式和解構函式Object筆記函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- 建構函式與解構函式函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- C++:建構函式的分類和呼叫C++函式
- C++建構函式解構函式的執行過程C++函式
- JS 建構函式與類JS函式
- C++複製建構函式C++函式
- c++建構函式詳解C++函式
- C++再議建構函式及複製建構函式深度複製C++函式
- ## 建構函式函式
- 建構函式函式
- C++學習筆記-----類和建構函式C++筆記函式
- 虛解構函式(√)、純虛解構函式(√)、虛建構函式(X)函式
- 第4周課後實踐·閱讀程式-建構函式和解構函式(2)函式
- 第4周課後實踐·閱讀程式-建構函式和解構函式(3)函式
- 第4周課後實踐·閱讀程式-建構函式和解構函式(4)函式
- 【C++】類初探常量成員函式與建構函式初始值列表C++函式
- [譯] 建構函式已死,建構函式萬歲!函式
- C++ Daily 《3》----建構函式可否是虛擬函式C++AI函式
- c++建構函式詳解薦C++函式
- 構造和解構函式呼叫順序函式
- c# tcbs之建構函式呼叫建構函式示例C#函式
- PHP筆記:建構函式與解構函式PHP筆記函式
- 《高質量C++/C程式設計指南》第9章:類的建構函式、解構函式與賦值函式C++C程式程式設計函式賦值
- C++ 類建構函式初始化列表介紹C++函式
- 迴圈單連結串列建構函式、解構函式C++實現函式C++