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