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

【C++初階】構(gòu)造函數(shù)和析構(gòu)函數(shù)

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

【C++初階】構(gòu)造函數(shù)和析構(gòu)函數(shù),C++,c++,java,jvm

一、類的六個(gè)默認(rèn)成員函數(shù)

??默認(rèn)成員函數(shù)
用戶沒有顯式實(shí)現(xiàn),編譯器會(huì)自動(dòng)生成的成員函數(shù),稱為默認(rèn)成員函數(shù)。
【C++初階】構(gòu)造函數(shù)和析構(gòu)函數(shù),C++,c++,java,jvm

  • 構(gòu)造函數(shù):完成對象的初始化工作。
  • 析構(gòu)函數(shù):完成對象空間的清理工作。
  • 拷貝構(gòu)造:使用同類對象初始化創(chuàng)建對象。
  • 賦值重載:把一個(gè)對象賦值給另外一個(gè)對象(該對象已存在)。
  • 取地址重載:獲取對象的地址,這兩個(gè)很少自己實(shí)現(xiàn)。

注意:構(gòu)造和析構(gòu)函數(shù),不是創(chuàng)建對象和銷毀對象。對象的創(chuàng)建和銷毀都是編譯器做的工作。

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

??為什么要有構(gòu)造函數(shù)?
為了避免每次創(chuàng)建對象后,都要去調(diào)用專門的成員函數(shù)設(shè)置對象的信息,這樣很麻煩,并且容易遺忘,那就想著能否在創(chuàng)建對象的同時(shí),就將信息設(shè)置進(jìn)去。因此,就有了構(gòu)造函數(shù)。以日期類為例:

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;//第一步:創(chuàng)建對象
	d1.Init(2022, 7, 5);//調(diào)用初始化函數(shù)
	d1.Print();
	Date d2;
	d2.Init(2022, 7, 6);
	d2.Print();
	return 0;
}

如上面的代碼,每次創(chuàng)建一個(gè)日期類對象后,都要手動(dòng)的去調(diào)用Init函數(shù),完成對象的初始化,整個(gè)過程繁瑣,而且容易遺忘,為此,提出了構(gòu)造函數(shù)的概念。

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

??構(gòu)造函數(shù)的特性

  • 函數(shù)名與類名相同。
  • 無返回值。(無需void)
  • 對象實(shí)例化時(shí)編譯器自動(dòng)調(diào)用對應(yīng)的構(gòu)造函數(shù)。
  • 構(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ù)
      Date d3();
 }

注意:如果通過無參構(gòu)造函數(shù)創(chuàng)建對象時(shí),對象后面不用跟括號(hào),否則就成了函數(shù)聲明。即Date d3();是聲明了一個(gè)d3函數(shù),該函數(shù)無參,返回一個(gè)日期類對象,并不是創(chuàng)建了一個(gè)日期類對象d3。

構(gòu)造函數(shù)在語法上可以是私有的,但是在創(chuàng)建對象的時(shí)候就調(diào)不動(dòng)了。在單例模式中,會(huì)把構(gòu)造函數(shù)搞成私有,具體的我們以后再說。

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

??示例:

class Date
{
 public:
	/*
	// 如果用戶顯式定義了構(gòu)造函數(shù),編譯器將不再生成
	Date(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;
	return 0;
}

將Date類中的構(gòu)造函數(shù)注釋掉后,代碼可以編譯通過,因?yàn)榫幾g器生成了一個(gè)無參的默認(rèn)構(gòu)造函數(shù)。將Date類中的構(gòu)造函數(shù)放開后,代碼編譯失敗,因?yàn)?strong>一旦顯式定義了任何構(gòu)造函數(shù),編譯器將不再生成默認(rèn)構(gòu)造函數(shù)。而此時(shí)Date中的構(gòu)造函數(shù)需要三個(gè)參數(shù),Date d1;會(huì)去調(diào)用無參的構(gòu)造函數(shù),但是當(dāng)前類中沒有無參的構(gòu)造函數(shù),所以編譯會(huì)報(bào)錯(cuò)。

??編譯器生成的構(gòu)造函數(shù)干了什么?
C++中把類型分為內(nèi)置類型自定義類型。內(nèi)置類型就是語言提供的數(shù)據(jù)類型,如:int、char……自定義類型就是我們使用class、struct、union等自己定義的類型。(所有類型的指針都屬于內(nèi)置類型)。

編譯器生成的默認(rèn)構(gòu)造函數(shù),對內(nèi)置類型不做處理,對自定義類型,會(huì)去調(diào)用它的默認(rèn)構(gòu)造函數(shù)

??示例:

//先定義一個(gè)時(shí)間類
class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};
//再定義一個(gè)日期類
class Date
{
private:
	// 基本類型(內(nèi)置類型)
	int _year;
	int _month;
	int _day;
	// 自定義類型
	Time _t;
};
int main()
{
	Date d;
	return 0;
}

【C++初階】構(gòu)造函數(shù)和析構(gòu)函數(shù),C++,c++,java,jvm

上面代碼,先定義了一個(gè)時(shí)間類Time,它的成員變量都是內(nèi)置類型,給這個(gè)類寫了一個(gè)無參的構(gòu)造函數(shù),接下來,定義了一個(gè)日期類Date,他有四個(gè)成員變量,其中_year_month_day都是內(nèi)置類型,_t是自定義類型,并且,我們沒有寫日期類的構(gòu)造函數(shù),這意味著,在創(chuàng)建對象的時(shí)候,會(huì)去使用編譯器生成的無參默認(rèn)構(gòu)造函數(shù)。

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

??示例:

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

【C++初階】構(gòu)造函數(shù)和析構(gòu)函數(shù),C++,c++,java,jvm

??默認(rèn)構(gòu)造函數(shù)
我們沒寫編譯器自動(dòng)生成的構(gòu)造函數(shù)、無參構(gòu)造函數(shù)、全缺省構(gòu)造函數(shù),這三種都叫做默認(rèn)構(gòu)造函數(shù),它們都有一個(gè)共同的特點(diǎn):可以不用傳參。默認(rèn)構(gòu)造函數(shù)只能有一個(gè),后面?zhèn)z,在語法上可以構(gòu)成函數(shù)重載,但是在無參調(diào)用的時(shí)候,會(huì)發(fā)生歧義,出現(xiàn)調(diào)用不明確。
【C++初階】構(gòu)造函數(shù)和析構(gòu)函數(shù),C++,c++,java,jvm
注意:要把默認(rèn)構(gòu)造函數(shù)和默認(rèn)成員函數(shù)區(qū)分清楚,默認(rèn)成員函數(shù)是我們不寫編譯器會(huì)自動(dòng)生成的,默認(rèn)構(gòu)造函數(shù)是不需要傳參的構(gòu)造函數(shù)。編譯器生成的構(gòu)造函數(shù),既是默認(rèn)構(gòu)造函數(shù),同時(shí)也是默認(rèn)成員函數(shù)。

??總結(jié)
一般情況下,都需要我們自己寫構(gòu)造函數(shù)。如果滿足以下情況,即:內(nèi)置類型的成員變量都有默認(rèn)值,且初始化符合我們的要求,自定義類型都定義了默認(rèn)構(gòu)造,此時(shí)可以考慮不寫構(gòu)造函數(shù),使用編譯器自動(dòng)生成的默認(rèn)構(gòu)造函數(shù)。自定義類型如果沒有對應(yīng)的構(gòu)造函數(shù),那就意味著初始化自定義類型需要傳參,此時(shí)必須自己寫構(gòu)造函數(shù),并且還會(huì)用到初始化列表。

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

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

??特性

  • 析構(gòu)函數(shù)名是在類名前加上~。
  • 無參數(shù)無返回值類型。
  • 一個(gè)類只能有一個(gè)析構(gòu)函數(shù),若未顯式定義,系統(tǒng)會(huì)自動(dòng)生成默認(rèn)的析構(gòu)函數(shù)。
  • 對象生命周期結(jié)束時(shí),C++編譯器自動(dòng)調(diào)用析構(gòu)函數(shù)。

小Tips:析構(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()//析構(gòu)函數(shù)
	{
		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);
}

【C++初階】構(gòu)造函數(shù)和析構(gòu)函數(shù),C++,c++,java,jvm

Stack中的成員變量_array、_capacity、_size都是內(nèi)置類型,所以在對象s生命周期結(jié)束要銷毀的時(shí)候,不需要資源清理,最后系統(tǒng)直接將其內(nèi)存回收即可,而_array指向的空間是在堆區(qū)上申請的,這塊空間不會(huì)隨著對象生命周期的結(jié)束而自動(dòng)釋放(歸還給操作系統(tǒng)),所以_array被回收后,就找不到動(dòng)態(tài)申請的那塊空間,會(huì)造成內(nèi)存泄漏,因此在對象銷毀前,要通過析構(gòu)函數(shù)去釋放成員變量_array指向的空間,這就是析構(gòu)函數(shù)的作用。

??編譯器生成的析構(gòu)函數(shù)干了什么?
我們不寫,編譯器會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù)。該析構(gòu)函數(shù)對內(nèi)置類型不做處理,對自定義類型會(huì)去調(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++初階】構(gòu)造函數(shù)和析構(gòu)函數(shù),C++,c++,java,jvm
main方法中創(chuàng)建了Date對象d,而d中包含4個(gè)成員變量,其中_year、_month、_day、三個(gè)是內(nèi)置類型成員,對象銷毀時(shí)不需要資源清理,最后系統(tǒng)直接將其內(nèi)存回收即可,而_t時(shí)Time類對象,在d銷毀時(shí),要將器內(nèi)部包含的Time類的_t對象銷毀,所以要去調(diào)用Time類的析構(gòu)函數(shù)。但是main函數(shù)中不能直接調(diào)用Time類的析構(gòu)函數(shù),實(shí)際銷毀的是Date類對象d,所以編譯器會(huì)調(diào)用Date類的析構(gòu)函數(shù),而Date類沒有顯示提供,則編譯器會(huì)給Date類生成一個(gè)默認(rèn)的析構(gòu)函數(shù),目的是在其內(nèi)部調(diào)用Time類的析構(gòu)函數(shù)。

??總結(jié)
一般情況下,有動(dòng)態(tài)申請資源,就需要顯式的寫析構(gòu)函數(shù)來釋放資源,沒有動(dòng)態(tài)申請的資源,可以不寫析構(gòu)函數(shù),需要釋放資源的成員都是自定義類型,也不需要寫析構(gòu)函數(shù)。


??結(jié)語:
?今天的分享到這里就結(jié)束啦!如果覺得文章還不錯(cuò)的話,可以三連支持一下,您的支持就是春人前進(jìn)的動(dòng)力!
【C++初階】構(gòu)造函數(shù)和析構(gòu)函數(shù),C++,c++,java,jvm文章來源地址http://www.zghlxwxcb.cn/news/detail-585614.html

到了這里,關(guān)于【C++初階】構(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)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

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

相關(guān)文章

  • C++ 構(gòu)造函數(shù)和析構(gòu)函數(shù) 詳解

    C++ 構(gòu)造函數(shù)和析構(gòu)函數(shù) 詳解

    C++中用構(gòu)造函數(shù)和析構(gòu)函數(shù)來初始化和清理對象,這兩個(gè)函數(shù)將會(huì)被編譯器自動(dòng)調(diào)用。對象的初始化和清理是非常重要的,如果我們不提供構(gòu)造函數(shù)與析構(gòu)函數(shù),編譯器會(huì)自動(dòng)提供兩個(gè)函數(shù)的空實(shí)現(xiàn)。 構(gòu)造函數(shù):主要作用于創(chuàng)建函數(shù)時(shí)對對象成員的屬性賦值。 析構(gòu)函數(shù):主

    2024年02月02日
    瀏覽(45)
  • C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)

    C++篇----構(gòu)造函數(shù)和析構(gòu)函數(shù)

    在很多時(shí)候,當(dāng)寫了初始化,動(dòng)態(tài)開辟的,需要寫銷毀函數(shù),寫了銷毀函數(shù)之后,但是卻忘記了調(diào)用這些函數(shù),忘記調(diào)用初始化函數(shù)還好,編譯器會(huì)報(bào)錯(cuò),但是如果是忘記調(diào)用銷毀函數(shù),那么編譯器是不會(huì)報(bào)錯(cuò),但是不能說這個(gè)程序就沒錯(cuò)哦了,反而有很大的問題,存在內(nèi)存

    2024年02月01日
    瀏覽(31)
  • 『C++成長記』構(gòu)造函數(shù)和析構(gòu)函數(shù)

    『C++成長記』構(gòu)造函數(shù)和析構(gòu)函數(shù)

    ?? 博客主頁: 小王又困了 ?? 系列專欄: C++ ?? 人之為學(xué),不日近則日退? ?? 感謝大家點(diǎn)贊??收藏?評論?? 目錄 一、類的六個(gè)個(gè)默認(rèn)成員函數(shù) ??1.1認(rèn)識(shí)默認(rèn)成員函數(shù)? 二、構(gòu)造函數(shù) ??2.1為什么要有構(gòu)造函數(shù) ??2.2構(gòu)造函數(shù)的概念 ??2.3構(gòu)造函數(shù)的特性 ??2.4編譯器

    2024年02月05日
    瀏覽(23)
  • C++構(gòu)造函數(shù)和析構(gòu)函數(shù)(附示例代碼)

    構(gòu)造函數(shù)和析構(gòu)函數(shù)是面向?qū)ο缶幊讨械闹匾拍?,用于?chuàng)建和銷毀對象。 構(gòu)造函數(shù) 是一種特殊的函數(shù),它在對象被創(chuàng)建時(shí)自動(dòng)調(diào)用。它的作用是初始化對象的狀態(tài),例如設(shè)置成員變量的默認(rèn)值、分配資源等操作。構(gòu)造函數(shù)與類同名且沒有返回值,可以有多個(gè)重載版本,同

    2024年02月03日
    瀏覽(39)
  • 【C++雜貨鋪】構(gòu)造函數(shù)和析構(gòu)函數(shù)

    【C++雜貨鋪】構(gòu)造函數(shù)和析構(gòu)函數(shù)

    ?? 默認(rèn)成員函數(shù) 用戶沒有顯式實(shí)現(xiàn),編譯器會(huì)自動(dòng)生成的成員函數(shù),稱為默認(rèn)成員函數(shù)。 構(gòu)造函數(shù) :完成對象的初始化工作。 析構(gòu)函數(shù) :完成對象空間的清理工作。 拷貝構(gòu)造 :使用同類對象初始化創(chuàng)建對象。 賦值重載 :把一個(gè)對象賦值給另外一個(gè)對象(該對象已存在

    2024年02月16日
    瀏覽(23)
  • 【c++】類和對象(三)構(gòu)造函數(shù)和析構(gòu)函數(shù)

    【c++】類和對象(三)構(gòu)造函數(shù)和析構(gòu)函數(shù)

    ?? 個(gè)人主頁 :Quitecoder ?? 專欄 :c++筆記倉 朋友們大家好,本篇文章我們帶來類和對象重要的部分, 構(gòu)造函數(shù)和析構(gòu)函數(shù) 如果一個(gè)類中什么成員都沒有,簡稱為空類 任何類在什么都不寫時(shí),編譯器會(huì)自動(dòng)生成以下6個(gè)默認(rèn)成員函數(shù) (用戶沒有顯式實(shí)現(xiàn),編譯器會(huì)生成的成

    2024年04月12日
    瀏覽(27)
  • 【C++】類和對象(中)---構(gòu)造函數(shù)和析構(gòu)函數(shù)

    【C++】類和對象(中)---構(gòu)造函數(shù)和析構(gòu)函數(shù)

    個(gè)人主頁:平行線也會(huì)相交?? 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 平行線也會(huì)相交 原創(chuàng) 收錄于專欄【C++之路】?? 本專欄旨在記錄C++的學(xué)習(xí)路線,望對大家有所幫助??? 希望我們一起努力、成長,共同進(jìn)步。?? 我們知道類包含成員變量和成員函數(shù),當(dāng)一個(gè)類中

    2024年02月05日
    瀏覽(23)
  • C++類開發(fā)第二篇(淺析構(gòu)造函數(shù)和析構(gòu)函數(shù))

    C++類開發(fā)第二篇(淺析構(gòu)造函數(shù)和析構(gòu)函數(shù))

    構(gòu)造函數(shù)是一種特殊的成員函數(shù),用于創(chuàng)建和初始化類的對象。它的 名稱與類的名稱相同 ,沒有返回值,也不需要顯式調(diào)用。在C++中,每個(gè)類都必須至少有一個(gè)構(gòu)造函數(shù)。 當(dāng)我們創(chuàng)建一個(gè)類的對象時(shí),編譯器會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)來初始化該對象的成員變量。構(gòu)造函數(shù)可以執(zhí)

    2024年02月19日
    瀏覽(30)
  • 【C++心愿便利店】No.5---構(gòu)造函數(shù)和析構(gòu)函數(shù)

    【C++心愿便利店】No.5---構(gòu)造函數(shù)和析構(gòu)函數(shù)

    ??個(gè)人主頁:@小沈YO. ??小編介紹:歡迎來到我的亂七八糟小星球?? ??專欄:C++ 心愿便利店 ??本章內(nèi)容:類和對象 記得 評論?? +點(diǎn)贊?? +收藏?? +關(guān)注??哦~ 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 如果一個(gè)類中什么成員都沒有,簡稱為空類。 空類中真的

    2024年02月09日
    瀏覽(25)
  • 【C++】繼承 ⑦ ( 繼承中的對象模型分析 | 繼承中的構(gòu)造函數(shù)和析構(gòu)函數(shù) )

    【C++】繼承 ⑦ ( 繼承中的對象模型分析 | 繼承中的構(gòu)造函數(shù)和析構(gòu)函數(shù) )

    下面有 3 個(gè)類 , 分別是 A 類 , B 類 , C 類 ; A 類是 基類 ; B 類 公有繼承 A 類 , 并定義了新的 成員變量 y ; C 類 公有繼承 B 類 , 并定義了新的 成員變量 z ; 分別定義上述 3 個(gè)類的對象 , 上述 3 個(gè)對象的內(nèi)存模型如下 : A 類對象 objA 中有一個(gè)成員 int x , 在內(nèi)存中只有一個(gè) int 類型的

    2024年02月08日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包