日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++析构器详解【C++析构器】

發布時間:2025/3/20 c/c++ 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++析构器详解【C++析构器】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 析構器(Destructor)
  • 手動釋放到自動銷毀
  • 發生時機
  • 析構器的作用
  • 語法規則
  • 析構規則
  • 析構器小結
  • 注意

析構器(Destructor)

手動釋放到自動銷毀

我們通過傳入參數的方式,動態的申請了堆內存的大小,既是堆內存,有申請必然會有釋放的。 當然可以通過傳統的方式來釋放申請的空間,現在我們介紹一種特別用于釋放資源的方式:析構函數,與類名同(前面需要帶個~號),無參無返回。會在對象銷毀時自動被調用,我們可以將堆內存釋放,放到其內。

#include <iostream> #include <string.h> using namespace std; class Stack { public: Stack(int size) {top = 0; _size = size; space = new int[_size]{0}; }~Stack() { delete []space; }bool isEmpty(); bool isFull(); void push(int data); int pop();private: int *space; int top; int _size; };bool Stack::isEmpty() { return top == 0; }

發生時機

以"~"開頭與類名相同,無參無返回的函數,在類對象銷毀時(棧/堆對象),自動調用,完成對象的銷毀。尤其是類中己申請的堆內存的釋放。

#include <iostream>using namespace std;struct Data { public:Data(int y = 0, int m = 0, int d = 0) //構造器:year(y), month(m), day(d){}~Data() //析構器{cout << "xxxxxxxxxxxxxxxxx" << endl;} private:int year;int month;int day; }; int main() {{Data d;}cout << "yyyyyyyyyyyy" << endl;Data* pd = new Data;delete pd; }

執行結果為:

上面打印結果我們先進行解釋說明:
第一行是創建的對象d在{}被使用完成之后打印。
第二行是主函數進行打印。
第三行是通過pd創建對象在釋放對象的時候打印。

析構器的作用

在對象被銷毀前被自動調用,用來處理清理工作。清理工作主要清理申請的堆內存空間。
在對象銷毀前:存在的一種是棧上的空間,一種是堆上的空間。

那么上面的示例,所有的空間都是在棧區申請,所以析構器存在的意義并不是很大。上面代碼中的析構器可以不用寫,系統會提供一個空體析構器進行棧上數據的清理。

我們接下來舉例一個需要的銷毀堆上的對象:

我們動態申請的空間,就需要內存釋放;
棧對象在堆內存申請了1024個字節,在對象執行完成之后會釋放1024個字節,

構造機制和析構機制就是系統給我們提供的自動調用的過程,里面的內容還是需要我們自行編寫。

那么對于棧對象和堆對象都是一樣的,在對象執行完成之后都需要調用析構器進行空間釋放。

代碼示例:

#include <iostream> #include <string.h> using namespace std;class Stack { public:Stack(int size = 1024)//生成對象的時候調用 構造器:top(0), SpaceSize(size), space(new char[size] {0}) //初始化列表{}bool isFull();bool isEmpty();void push(char ch);char pop();~Stack() //析構器{cout << "xxxxxxxxxxxxx"<<endl;delete[]space;}private:int top;char* space;int SpaceSize; };bool Stack::isFull() {return top == SpaceSize; //修改判滿條件 }bool Stack::isEmpty() {return top == 0; }void Stack::push(char ch) {space[top++] = ch; } char Stack::pop() {return space[--top]; }int main() {{Stack s; //棧對象}Stack* ps = new Stack(1000); //堆對象delete ps;return 0; }

運行結果為:

語法規則

class 類名 {~類名()析構體 }class A {~A(){} }

析構規則

析構器小結

析構器并不是所有的時候都需要自實現。在沒有堆空間的對象中,可以使用系統默認提供的空體析構器。在對象有堆空間申請的情況中,必須要有自定義的析構器對于申請的堆內存空間進行釋放,析構器會在對象銷毀前自動調用。

棧上的內存空間會在對象銷毀時自動回收。

析構器與類同名,無參無返回值,前面加上一個~

在對象被銷毀前自動調用,被調用于處理清理申請的堆空間對象。

如果沒有自實現,系統提供一個默認的空體析構器。

注意

一般來說,不要把析構器劃分為函數,而是C++提供的一種機制。不能單純的理解為函數,而是一種析構機制。

總結

以上是生活随笔為你收集整理的C++析构器详解【C++析构器】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。