国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù))

這篇具有很好參考價值的文章主要介紹了【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù)),C++,c++,開發(fā)語言,c語言

??個人主頁:Forcible Bug Maker

??專欄:C++

目錄

前言

類的6個默認(rèn)成員函數(shù)

構(gòu)造函數(shù)

概念

構(gòu)造函數(shù)的特性及用法

析構(gòu)函數(shù)

概念

析構(gòu)函數(shù)的特性及用法

結(jié)語


前言

本篇主要內(nèi)容:類的6個默認(rèn)成員函數(shù)中的構(gòu)造函數(shù)析構(gòu)函數(shù)

進(jìn)入到類和對象內(nèi)容的第二節(jié),上篇博客中介紹了類和對象的一些基本特性,接下來就要講到類的六個默認(rèn)成員函數(shù)。C++類的六個默認(rèn)成員函數(shù)包括:構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、賦值運(yùn)算符重載、取地址重載和const取地址重載。這些函數(shù)在特定情況下會被編譯器自動生成,但你也可以根據(jù)需要自定義它們。

類的6個默認(rèn)成員函數(shù)

在一個類中,如果你什么都不往里寫,那么就可以稱這個類為空類。實(shí)際上,在你什么都不往空類里寫時,編譯器會自動生成以下6個默認(rèn)成員函數(shù)。

默認(rèn)成員函數(shù):用戶沒有顯式實(shí)現(xiàn),編譯器會生成的成員函數(shù)稱為默認(rèn)成員函數(shù)。

// 這是一個空類
class Date {};

【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù)),C++,c++,開發(fā)語言,c語言

構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、賦值運(yùn)算符重載、取地址重載和const取地址重載。

構(gòu)造函數(shù)

概念

接下來舉個例子引入構(gòu)造函數(shù)。如果你寫了一個存儲日期的類(Date),在使用Date定義的對象之前,都需要像C語言一樣調(diào)用一遍初始化。

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	d1.Init(2022, 7, 5);
	d1.Print();
	Date d2;
	d2.Init(2022, 7, 6);
	d2.Print();
	return 0;
}

你看,使用對象d1和d2之前都需要調(diào)用一遍Init函數(shù)來給對象設(shè)置日期,但如果每次創(chuàng)建對象時都調(diào)用該方法,未免有些麻煩,是否存在某種方式,在創(chuàng)建對象時,就將信息設(shè)置進(jìn)去呢?答案是有的,解決方式就是今天的構(gòu)造函數(shù)。

構(gòu)造函數(shù)是一個特殊的成員函數(shù),名字與類名相同,創(chuàng)建類類型對象時由編譯器自動調(diào)用,以保證每個數(shù)據(jù)成員都有 一個合適的初始值,并且在對象整個生命周期內(nèi)只調(diào)用一次。

構(gòu)造函數(shù)的特性及用法

構(gòu)造函數(shù)是特殊的成員函數(shù),需要注意的是,構(gòu)造函數(shù)雖然名稱叫構(gòu)造,但是構(gòu)造函數(shù)的主要任務(wù)并不是開空間創(chuàng)建對象,而是初始化對象

1. 函數(shù)名和類名相同。

2. 無返回值(不是void,而是根本就不用寫其返回值)。

3. 對象實(shí)例化時編譯器自動調(diào)用對應(yīng)的構(gòu)造函數(shù)。

4. 構(gòu)造函數(shù)可以重載

class Date
{
public:
	// 1.無參構(gòu)造函數(shù)
	Date(){}
	// 2.帶參構(gòu)造函數(shù)
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
void TestDate()
{
	Date d1; // 調(diào)用無參構(gòu)造函數(shù)
	Date d2(2015, 1, 1); // 調(diào)用帶參的構(gòu)造函數(shù)
}

注:如果通過無參構(gòu)造函數(shù)創(chuàng)建對象時,對象后面不用跟括號,否則就成了函數(shù)聲明。

Date d3();

如果你寫下這樣一行代碼來創(chuàng)建對象,就大錯特錯了。這句話會被編譯器解讀成一種函數(shù)聲明(其細(xì)節(jié)是:聲明了d3函數(shù),該函數(shù)無參,返回一個日期類型的對象),無法達(dá)到創(chuàng)建對象的目的。

5.?如果類中沒有顯式定義構(gòu)造函數(shù),則C++編譯器會自動生成一個無參的默認(rèn)構(gòu)造函數(shù),一旦用戶顯式定義編譯器將不再生成

【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù)),C++,c++,開發(fā)語言,c語言

其中定義了傳參的構(gòu)造函數(shù),無參的默認(rèn)構(gòu)造將被覆蓋,也就是說,此時定義變量不傳參會編譯失敗,報錯:error C2512: “Date”: 沒有合適的默認(rèn)構(gòu)造函數(shù)可用。

【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù)),C++,c++,開發(fā)語言,c語言

6.?C++把類型分成內(nèi)置類型(基本類型)和自定義類型。對于內(nèi)置類型,C++默認(rèn)生成的構(gòu)造函數(shù)對內(nèi)置類型不做處理(所以未定義自定義類型中的數(shù)據(jù)為隨機(jī)值),對自定義類型的成員,會去調(diào)用它的默認(rèn)構(gòu)造(不用傳參數(shù)的構(gòu)造)。內(nèi)置類型就是語言提供的數(shù)據(jù)類型,如:int/char...,自定義類型就是我們使用class/struct/union等自己定義的類型。

【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù)),C++,c++,開發(fā)語言,c語言

就比如上面的代碼,Date類中默認(rèn)生成的構(gòu)造函數(shù)調(diào)用了自定義類型 _t 的無參構(gòu)造函數(shù)。

注:C++11 中針對內(nèi)置類型成員不初始化的缺陷,又打了補(bǔ)丁,即:內(nèi)置類型成員變量在類中聲明時可以給默認(rèn)值。

【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù)),C++,c++,開發(fā)語言,c語言

上面代碼給了內(nèi)置類型缺省值,在生成d對象之后,內(nèi)置類型也就成功被缺省值賦值了。

7. 無參的構(gòu)造函數(shù)和全缺省的構(gòu)造函數(shù)都稱為默認(rèn)構(gòu)造函數(shù),并且默認(rèn)構(gòu)造函數(shù)只能有一個。

注:默認(rèn)構(gòu)造:不傳參就可以調(diào)用的函數(shù)。故:無參構(gòu)造函數(shù)、全缺省構(gòu)造函數(shù)、我們沒寫編譯器默認(rèn)生成的構(gòu)造函數(shù),都可以認(rèn)為是默認(rèn)構(gòu)造函數(shù)。

class Date
{
public:
	Date()
	{
		_year = 1900;
		_month = 1;
		_day = 1;
	}
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
// 以下測試函數(shù)能通過編譯嗎?
void Test()
{
	Date d1;
}

根據(jù)第七點(diǎn),我們知道Test函數(shù)是不能通過編譯的,在類中定義了兩個默認(rèn)構(gòu)造(不傳參就可以調(diào)用的構(gòu)造函數(shù)),編譯器無法確認(rèn)應(yīng)該調(diào)用哪一個,模棱兩可的代碼是編程的大忌。

【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù)),C++,c++,開發(fā)語言,c語言

析構(gòu)函數(shù)

概念

通過了前面構(gòu)造函數(shù)的學(xué)習(xí),我們認(rèn)識了可以在創(chuàng)建對象時幫助初始化的函數(shù),那相應(yīng)的,是否就應(yīng)該有對對象進(jìn)行自動銷毀和清理的函數(shù)呢?答案是有的。

析構(gòu)函數(shù):與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對對象本身的銷毀,局部對象銷毀工作是由編譯器完成的。而對象在銷毀時會自動調(diào)用析構(gòu)函數(shù),完成對象中資源的清理工作。

析構(gòu)函數(shù)的特性及用法

析構(gòu)函數(shù)是特殊的成員函數(shù),它在對象的生命周期結(jié)束時自動被調(diào)用,用于執(zhí)行清理工作,如釋放動態(tài)分配的內(nèi)存、關(guān)閉打開的文件、斷開網(wǎng)絡(luò)連接等。析構(gòu)函數(shù)與類名同名,但前面加上一個波浪號(~),并且沒有返回類型和參數(shù)。

1. 析構(gòu)函數(shù)名是在類名前加上字符 ~

2. 無參數(shù)無返回值類型。

3. 一個類只能有一個析構(gòu)函數(shù)。若未顯示定義,系統(tǒng)會自動生成默認(rèn)的析構(gòu)函數(shù)。注意:析構(gòu)函數(shù)不能重載。

4. 對象生命周期結(jié)束時,C++編譯系統(tǒng)自動調(diào)用析構(gòu)函數(shù)

typedef int DataType;
class Stack
{
public:
	Stack(size_t capacity = 3)
	{
		_array = (DataType*)malloc(sizeof(DataType) * capacity);
		if (NULL == _array)
		{
			perror("malloc申請空間失敗!!!");
			return;
		}
		_capacity = capacity;
		_size = 0;
	}
	void Push(DataType data)
	{
		// CheckCapacity();
		_array[_size] = data;
		_size++;
	}
	// 其他方法...
	~Stack()
	{
		if (_array)
		{
			free(_array);
			_array = NULL;
			_capacity = 0;
			_size = 0;
		}
	}
private:
	DataType* _array;
	int _capacity;
	int _size;
};
void TestStack()
{
	Stack s;
	s.Push(1);
	s.Push(2);
}

上份代碼可以把重點(diǎn)放在構(gòu)造函數(shù)和析構(gòu)函數(shù)上。在構(gòu)造函數(shù)Stack中,使用malloc在堆上開辟了一塊空間,使用內(nèi)置類型 _capacity 和 _size 來維護(hù)整個棧;最后定義了析構(gòu)函數(shù)~stack,在此函數(shù)中,我們在函數(shù)內(nèi)部實(shí)現(xiàn)了堆中占用內(nèi)存的釋放。

什么?你告訴我你不知道什么是棧?推薦你看看這篇博客:初階數(shù)據(jù)結(jié)構(gòu)之---棧和隊(duì)列(C語言)

指針類型屬于內(nèi)置類型

如果不自己實(shí)現(xiàn)析構(gòu)函數(shù),編譯器會將_array當(dāng)作內(nèi)置類型,在自動生成的析構(gòu)函數(shù)中不會釋放堆中占用的空間,導(dǎo)致內(nèi)存泄露。

5. 關(guān)于編譯器自動生成的析構(gòu)函數(shù),和構(gòu)造函數(shù)很類似:編譯器生成的默認(rèn)析構(gòu)函數(shù),對內(nèi)置類型成員不做處理;對于自定義類型的成員,調(diào)用它的析構(gòu)函數(shù)。

class Time
{
public:
	~Time()
	{
		cout << "~Time()" << endl;
	}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
private:
	// 基本類型(內(nèi)置類型)
	int _year = 1970;
	int _month = 1;
	int _day = 1;
	// 自定義類型
	Time _t;
};
int main()
{
	Date d;
	return 0;
}

【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù)),C++,c++,開發(fā)語言,c語言

你會發(fā)現(xiàn),在main方法中根本就沒有直接創(chuàng)建Time類的對象,但是最后還是調(diào)用了Time類的析構(gòu)函數(shù)。是因?yàn)?strong>在main方法中創(chuàng)建了Date對象d,而d中包含4個成員變量,其中_year,_month,_day三個是內(nèi)置類型成員,銷毀時不需要資源清理,最后直接將其內(nèi)存回收即可;而_t是Time類對象,所以在d銷毀時,要將其內(nèi)部包含Time類的_t對象銷毀,所以要調(diào)用Time類的析構(gòu)函數(shù)。但是,main函數(shù)中不能直接調(diào)用Time類的析構(gòu)函數(shù),實(shí)際釋放的是Date類對象,所以編譯器會調(diào)用Date類的析構(gòu)函數(shù),而Date沒有顯示提供,則編譯器會給Date類生成一個默認(rèn)的析構(gòu)函數(shù),目的是在其內(nèi)部調(diào)用Time類的析構(gòu)函數(shù),即當(dāng)Date對象銷毀時,能保證內(nèi)部每個定義的對象都可以正確銷毀。

注:創(chuàng)建哪個類的對象則調(diào)用該類的析構(gòu)函數(shù),銷毀哪個類的對象則調(diào)用該類的析構(gòu)函數(shù)

6. 類中沒有申請資源時,析構(gòu)函數(shù)可以不寫,直接使用編譯器生成的默認(rèn)析構(gòu)函數(shù),比如:Date類;有資源申請時,一定要寫,否則會造成內(nèi)存泄露,如Stack類。

結(jié)語

本篇博客將重點(diǎn)放在了類和對象六個默認(rèn)成員函數(shù)的前兩個:構(gòu)造函數(shù)和析構(gòu)函數(shù)上。這兩個默認(rèn)成員函數(shù)在對象的生命周期中起著至關(guān)重要的作用。構(gòu)造函數(shù)確保對象在創(chuàng)建時能夠正確初始化,而析構(gòu)函數(shù)則確保對象在銷毀時能夠正確清理資源,從而保持程序的穩(wěn)定性和安全性。在下一篇博客中,我會介紹拷貝構(gòu)造函數(shù)、賦值運(yùn)算符重載、取地址重載和const取地址重載(另外四大默認(rèn)成員函數(shù))的內(nèi)容,敬請期待。

本篇博客到此結(jié)束,感謝大家的支持!?文章來源地址http://www.zghlxwxcb.cn/news/detail-853721.html

到了這里,關(guān)于【C++】類和對象②(類的默認(rèn)成員函數(shù):構(gòu)造函數(shù) | 析構(gòu)函數(shù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包