C++ 析構(gòu)函數(shù)
發(fā)布時(shí)間:2023-12-14 14:52:10
函數(shù)是僅在調(diào)用時(shí)運(yùn)行的代碼塊??梢詫?shù)據(jù)(稱為參數(shù))傳遞給函數(shù)。函數(shù)可以返回?cái)?shù)據(jù)。函數(shù)是組織好的,可重復(fù)使用的C++| 析構(gòu)函數(shù),用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。本文主要介紹C++ 析構(gòu)函數(shù)。
1、析構(gòu)函數(shù)
類的析構(gòu)函數(shù)是類的一種特殊的成員函數(shù),它會(huì)在每次刪除所創(chuàng)建的對(duì)象時(shí)執(zhí)行。刪除對(duì)象時(shí),自動(dòng)被調(diào)用,用來釋放對(duì)象占用的空間。析構(gòu)函數(shù)的名稱與類的名稱是完全相同的,只是在前面加了個(gè)波浪號(hào)(~
)作為前綴,它不會(huì)返回任何值,也不能帶有任何參數(shù)。析構(gòu)函數(shù)有助于在跳出程序(比如關(guān)閉文件、釋放內(nèi)存等)前釋放資源。
2、C++ 創(chuàng)建對(duì)象三種方式
如在C++中定義了一個(gè)Test
類,有三種方式創(chuàng)建對(duì)象:
1)棧中分配內(nèi)存
Test p1(1);
2)棧中分配內(nèi)存,是上面創(chuàng)建的完整模式
Test p2 = Test(2);
3)堆中分配內(nèi)存
Test *p3 = new Test(3);
注意:棧中分配內(nèi)存,在棧中內(nèi)存由系統(tǒng)自動(dòng)的去分配和釋放,而使用new創(chuàng)建的指針對(duì)象是在堆中分配內(nèi)存,當(dāng)不需要該對(duì)象時(shí),需要我們手動(dòng)的去釋放,否則會(huì)造成內(nèi)存泄漏。棧中對(duì)象的釋放順序,是后定義的先釋放。
3、析構(gòu)函數(shù)的使用示例
1)相同作用域
#include <iostream>
using namespace std;
class Test
{
int id;
public:
Test(int i)
{
id = i;
}
~Test()
{
cout<<"ID: "<<id<<" destruction function is invoked!"<<endl;
};
};
int main()
{
Test t0(0); //棧中分配
Test t1[3]{1,1,1}; //棧中分配,數(shù)組型對(duì)象
Test *t2 = new Test(2); //堆中分配
delete t2;
Test *t3 = new Test[3]{3,3,3};//堆中分配
delete []t3;
cout<<"------End of Main-------"<<endl;
return 0;
}
2)不同作用域
#include <iostream>
using namespace std;
class Test
{
int id;
public:
Test(int i)
{
id = i;
}
~Test()
{
cout<<"ID: "<<id<<" destruction function is invoked!"<<endl;
};
};
Test t0(0); //最先創(chuàng)建的對(duì)象,最后釋放
void Func()
{
static Test t1(1); //創(chuàng)建靜態(tài)對(duì)象,會(huì)在整個(gè)程序結(jié)束時(shí)自動(dòng)釋放
Test t2(2); //在Func結(jié)束時(shí)自動(dòng)釋放
cout<<"-----Func-----"<<endl;
}
int main()
{
Test t3(3);
t3 = 10; //類型轉(zhuǎn)換構(gòu)造函數(shù),這里會(huì)創(chuàng)建臨時(shí)對(duì)象,將int型轉(zhuǎn)成Test類型對(duì)象,在賦值結(jié)束后,臨時(shí)變量銷毀
cout<<"------Begin of Main-------"<<endl;
{
Test t4(4); //花括號(hào)代表作用域,不需要等到main方法結(jié)束就釋放了
}
Func(); //進(jìn)入Func函數(shù)
cout<<"------End of Main-------"<<endl;
return 0;
}
以上為本次所有分享內(nèi)容