欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++超詳細講解析構函數(shù)

 更新時間:2022年06月02日 08:36:40   作者:iheal  
既然在創(chuàng)建對象時有構造函數(shù)(給成員初始化),那么在銷毀對象時應該還有一個清除成員變量數(shù)據的操作咯,析構函數(shù)與構造函數(shù)功能相反,析構函數(shù)不是完成對象的銷毀,局部對象銷毀工作是由編譯器完成的。而對象在銷毀時會自動調用析構函數(shù),完成類的一些資源清理工作

特性

析構函數(shù)是特殊的成員函數(shù)

特征如下:

  • 析構函數(shù)名是~類名;
  • 無參數(shù)無返回值;
  • 一個類有且只有一個析構函數(shù);
  • 對象聲明周期結束,編譯器自動調用析構函數(shù);
class Stack
{
public:
	Stack(int capacity = 4)
		:
		_size(0),
		_capacity(capacity),
		_p(new int[_capacity])
	{
		cout << "Stack(int capacity = 4)" << endl;
	}
	~Stack()
	{
		cout << "~Stack()" << endl;
		if (_p)
		{
			delete[](_p);
            _p = nullptr;
		}
		_size = _capacity = 0;
	}
private:	
	int _capacity;
	int _size;
	int* _p;
};
int main()
{
	Stack s;
	return 0;//程序結束,調用s的析構函數(shù)
}

輸出:

析構函數(shù)處理自定義類型

class String
{
public:
	String(const char* str = "songxin")
	{
		cout << "String(const char* str = \"songxin\")" << endl;
		_str = (char*)malloc(strlen(str) + 1);
		strcpy(_str, str);
	}
	~String()
	{
		cout << "~String()" << endl;
		free(_str);
		_str = nullptr;
	}
private:
	char* _str;
};
class Person
{
public:
	Person()
		:
		_age(20),
		_name()
	{
		cout << "Person()" << endl;
	}
	~Person()
	{
		cout << "~Person()" << endl;
	}
private:
	String _name;
	int _age;
};
int main()
{
	Person p;
	return 0;
}

輸出:

析構函數(shù)在程序即將結束時,調用了Person的析構函數(shù),在Person類的析構函數(shù)即將結束接著調用String類的析構函數(shù)。

歸納一下:

析構函數(shù)是與構造函數(shù)執(zhí)行相反的操作的,構造函數(shù)負責給對象成員變量初始化并加載資源,而析構函數(shù)則是給對象的成員變量清理資源,而不是清理對象本身。

編譯器生成的默認析構函數(shù)

編譯器默認生成的析構函數(shù)能做些什么工作呢?我們前面已經介紹了編譯器生成的構造函數(shù)會去只會處理自定義類型的成員變量,那么析構既然和構造相對應,析構也應該是只去處理自定義類型的成員變量吧,確實如此,析構函數(shù)不會對內置類型有任何處理,只會在調用自身的析構后再去調用自定義類型成員的析構。

關于編譯器自動生成的析構函數(shù),下面的程序我們會看到,編譯器生成的析構函數(shù),會對自定類型成員調用它的析構函數(shù)。

class String
{
public:
	String(const char* str = "songxin")
	{
		cout << "String(const char* str = \"songxin\")" << endl;
		_str = (char*)malloc(strlen(str) + 1);
		strcpy(_str, str);
	}
	~String()
	{
		cout << "~String()" << endl;
		free(_str);
		_str = nullptr;
	}
private:
	char* _str;
};
class Person
{
public:
	Person()
		:
		_age(20),
		_name()
	{
		cout << "Person()" << endl;
	}
	
private:
	String _name;
	int _age;
};
int main()
{
	Person p;
	return 0;
}

輸出:

默認生成的析構函數(shù)對成員變量的處理

  • 內置類型不處理;
  • 自定義類型成員調用相應的析構函數(shù);

那成員變量中的內置類型處不處理其實都無所謂嘛,反正都要歸還給操作系統(tǒng),但是有例外:

如果成員變量含有指針,并且指針指向一塊我們正使用的空間,指針也是內置類型,那如果不釋放指針指向的那塊空間就會造成內存泄漏,而編譯器生成的析構函數(shù)是不會處理此情況的,因為需要我們在析構函數(shù)中主動釋放內存,也就是說需要我們顯式的去定義析構函數(shù)。

class Stack
{
public:
	Stack(int capacity = 4)
		:
		_size(0),
		_capacity(capacity),
		_p(new int[_capacity])//使用new去申請內存
	{
		cout << "Stack(int capacity = 4)" << endl;
	}
	~Stack()
	{
		cout << "~Stack()" << endl;
		if (_p)
		{
			delete[](_p);//釋放內存
            _p = nullptr;
		}
		_size = _capacity = 0;
	}
private:	
	int _capacity;
	int _size;
	int* _p;
};
int main()
{
	Stack s;
	return 0;//程序結束,調用s的析構函數(shù)
}

析構函數(shù)無論是我們顯式定義的還是編譯器生成的,都會在對象的聲明周期結束時自動調用,并且會調用自定義類型成員變量的析構函數(shù)來釋放資源,而對內置類型不做處理。

可以不顯式定義析構函數(shù)的情況

  • 類的成員都是自定義類型的;
  • 類的成員都是非指針的內置類型;
  • 成員有指針,但并沒有管理內存資源;

如果類的成員變量有指針類型,并且我們讓指針指向了一塊動態(tài)分配的空間,那么就需要我們自己寫析構函數(shù)了。

總結:不是類直接管理另一塊內存資源的,就不需要寫析構函數(shù),編譯器自己生成的就能處理。

到此這篇關于C++超詳細講解析構函數(shù)的文章就介紹到這了,更多相關C++析構函數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言 指針與數(shù)組的詳解及區(qū)別

    C語言 指針與數(shù)組的詳解及區(qū)別

    這篇文章主要介紹了C語言 指針與數(shù)組的詳解及對比的相關資料,需要的朋友可以參考下
    2017-03-03
  • C語言 makefile學習及實現(xiàn)實例

    C語言 makefile學習及實現(xiàn)實例

    這篇文章主要介紹了C語言 makefile學習及實現(xiàn)實例的相關資料,需要的朋友可以參考下
    2017-03-03
  • Qt通過圖片組繪制動態(tài)圖片

    Qt通過圖片組繪制動態(tài)圖片

    這篇文章主要為大家詳細介紹了Qt通過圖片組繪制動態(tài)圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++設計模式之享元模式

    C++設計模式之享元模式

    這篇文章主要介紹了C++設計模式之享元模式,本文講解了什么是享元模式、享元模式代碼實例、享元模式的優(yōu)點等內容,需要的朋友可以參考下
    2014-10-10
  • C++中的 % 的含義說明

    C++中的 % 的含義說明

    很多朋友私信小編不理解C++中的 % 的含義,其實有兩種意思,一種是格式化字符串輸出另一種是整數(shù)取余,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2023-03-03
  • 基于Qt制作一個定時關機的小程序

    基于Qt制作一個定時關機的小程序

    這篇文章主要為大家詳細介紹了如何基于Qt制作一個有趣的定時關機的小程序,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-12-12
  • C++實現(xiàn)翻轉單詞順序

    C++實現(xiàn)翻轉單詞順序

    這篇文章給大家匯總介紹了C++實現(xiàn)翻轉單詞順序的三種方法,都非常的簡單,需要的朋友可以參考下
    2016-07-07
  • C++基于EasyX圖形庫實現(xiàn)2048小游戲

    C++基于EasyX圖形庫實現(xiàn)2048小游戲

    這篇文章主要為大家詳細介紹了C++基于EasyX圖形庫實現(xiàn)2048小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C語言 以字符串的形式讀寫文件詳解及示例代碼

    C語言 以字符串的形式讀寫文件詳解及示例代碼

    本文主要介紹 C語言以字符串的形式讀寫文件,這里提供了詳細的資料及簡單示例代碼以便大家學習參考,有學習此部分的小伙伴可以參考下
    2016-08-08
  • VC6.0打開文件以及向工程中添加文件時程序崩潰自動退出解決方法

    VC6.0打開文件以及向工程中添加文件時程序崩潰自動退出解決方法

    vc6.0程序中,點擊打開文件以及向工程中添加文件時,程序竟然崩潰自動退出了,不知什么原因,安裝相同的vc程序,本本竟然出現(xiàn)此緣故
    2013-01-01

最新評論