最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++中類的六大默認(rèn)成員函數(shù)

 更新時(shí)間:2022年10月14日 14:20:54   作者:蔣靈瑜的筆記本  
這篇文章主要介紹了C++類中的六大默認(rèn)成員函數(shù)的原理雨使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

二、構(gòu)造函數(shù)Date(形參列表)

構(gòu)造函數(shù)主要完成初始化對象,相當(dāng)于C語言階段寫的Init函數(shù)。

默認(rèn)構(gòu)造函數(shù):無參的構(gòu)造函數(shù)或全缺省的構(gòu)造函數(shù),二者只能存在一個,同時(shí)存在類中,調(diào)用時(shí)會出現(xiàn)二義性。

1、構(gòu)造函數(shù)的函數(shù)名和返回值

構(gòu)造函數(shù)的函數(shù)名和類名相同且無返回值

2、構(gòu)造函數(shù)的調(diào)用

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

3、構(gòu)造函數(shù)的重載

構(gòu)造函數(shù)可以重載(多種初始化方式)注意:雖然全缺省和無參的構(gòu)造函數(shù)構(gòu)成重載,但是調(diào)用時(shí)存在二義性。

class Date
{
public:
	//構(gòu)造函數(shù)的重載
	Date()
	{
 
	}
	Date(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;//創(chuàng)建并通過無參構(gòu)造函數(shù)初始化對象時(shí),無需加括號,不然變成了函數(shù)聲明
	Date d2(2022,9,23);
	return 0;
}

4、系統(tǒng)生成的默認(rèn)構(gòu)造函數(shù)

如果我們在類中不寫構(gòu)造函數(shù),C++編譯器會在類中幫我們生成一個無參的構(gòu)造函數(shù)。我們寫了構(gòu)造函數(shù),那么系統(tǒng)將不會生成。

我們構(gòu)造對象并調(diào)用構(gòu)造函數(shù)時(shí),初始化的數(shù)據(jù)是隨機(jī)值:

5、系統(tǒng)生成的默認(rèn)構(gòu)造函數(shù)的作用

系統(tǒng)生成默認(rèn)構(gòu)造函數(shù)對內(nèi)置類型不處理,對自定義類型調(diào)用他的構(gòu)造函數(shù)。

注意:下方代碼中,Date類中的內(nèi)置類型將會調(diào)用Date類中的構(gòu)造函數(shù);Date類中的Time _t將會調(diào)用Time類中的構(gòu)造函數(shù)。

6、可以在內(nèi)置類型的成員變量的聲明中給缺省值

C++11中針對內(nèi)置類型不處理初始化為隨機(jī)值的問題,打了補(bǔ)?。簝?nèi)置類型成員變量在類中聲明可以給默認(rèn)值,甚至可以給動態(tài)開辟的缺省值,缺點(diǎn)是不能判斷空間是否開辟成功。

注意這里的默認(rèn)值是缺省值,不是初始化。初始化是要等對象調(diào)用時(shí)才叫初始化。

class Date
{
private:
	int _year=1;
	int _month=2;
	int _day=3;
	int* arr = (int*)malloc(sizeof(int) * 5);
};

這個特性只能用于解決默認(rèn)構(gòu)造函數(shù)初始化為隨機(jī)值的問題。這個特性不能解決對象的多種初始化方式(這也是構(gòu)造函數(shù)支持重載的原因),構(gòu)造函數(shù)該寫還是得自己寫。

7、初始化列表初始化

  • 1、對象的每個成員變量是在初始化列表部分進(jìn)行初始化,而函數(shù)體內(nèi)的行為是對成員函數(shù)賦初值。
  • 2、如果沒有在初始化列表里顯示初始化某個成員函數(shù),對于內(nèi)置類型,有缺省值用缺省值,無缺省值初始化為隨機(jī)值;對于自定義類型將會調(diào)用它的默認(rèn)構(gòu)造函數(shù),沒有找到默認(rèn)構(gòu)造就會報(bào)錯。
  • 3、引用、const、無默認(rèn)構(gòu)造函數(shù)的自定義類型必須通過初始化列表初始化。
  • 4、成員變量在類中聲明次序就是其在初始化列表中的初始化順序,與其在初始化列表中的先后次序無關(guān)。
Date(int year=1,int month=1,int day=1)//缺省值
    :_year(year)//成員變量的定義
    ,_month(month)
    ,_day(day)
{}//成員變量的賦初值

總結(jié):盡量使用使用初始化列表進(jìn)行初始化,在類中盡量提供默認(rèn)構(gòu)造函數(shù)(最好是全缺省的默認(rèn)構(gòu)造函數(shù))

8、單參數(shù)構(gòu)造(C++98)、多參數(shù)構(gòu)造(C++11)

class Date
{
public:
	Date(int year=1,int month=1,int day=1)
		:_year(year)
		,_month(month)
		,_day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	//單參數(shù)的構(gòu)造,構(gòu)造+拷貝,編譯器直接優(yōu)化為構(gòu)造C++98
	Date d1 = 2022;
	//臨時(shí)對象具有常性,構(gòu)造+拷貝,編譯器不會優(yōu)化
	const Date& d2 = 2023;
	//多參數(shù)的構(gòu)造C++11
	Date d3 = { 2022,10,16 };
	return 0;
}
  • 1、在構(gòu)造時(shí),支持等號加參數(shù)的構(gòu)造形式,實(shí)際上發(fā)生的是隱式類型轉(zhuǎn)換。2022由int類型隱式類型轉(zhuǎn)換為Date型的臨時(shí)對象,該臨時(shí)對象再將它的值拷貝構(gòu)造給d1。
  • 2、2023會隱式類型轉(zhuǎn)換為Date類型的臨時(shí)對象,具有常屬性。d2是這個臨時(shí)對象的引用,所以需要加上const。這里發(fā)生構(gòu)造+拷貝構(gòu)造,涉及臨時(shí)對象的引用,所以編譯器并不會發(fā)生優(yōu)化。
  • 3、可以使用explicit關(guān)鍵字修飾構(gòu)造函數(shù),會禁止隱式類型轉(zhuǎn)換。

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

析構(gòu)函數(shù):與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對對象本身的銷毀,局部對象銷毀工作是由編譯器完成的。而對象在銷毀時(shí)會自動調(diào)用析構(gòu)函數(shù),完成對象中資源的清理工作。資源包括動態(tài)開辟的空間,文件的關(guān)閉等。相當(dāng)于C語言階段寫的destroy函數(shù)。

1、析構(gòu)函數(shù)的函數(shù)名、參數(shù)和返回值

析構(gòu)函數(shù)的函數(shù)名是類名前加~,無參無返回值類型。

2、析構(gòu)函數(shù)的特點(diǎn)

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

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

3、編譯器生成的默認(rèn)析構(gòu)函數(shù)

對于編譯器生成的默認(rèn)析構(gòu)函數(shù),對自定義類型調(diào)用他的析構(gòu)函數(shù)。對于內(nèi)置類型,沒有需要處理資源。

注意:Date類中的內(nèi)置類型會調(diào)用Date類中的析構(gòu)函數(shù);Date類中的自定義類型Time _t會調(diào)用Time的析構(gòu)函數(shù)。

四、拷貝構(gòu)造Date(const Date& d)

1、拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的重載

拷貝構(gòu)造函數(shù):只有單個形參,該形參是對本類類型對象的引用(一般常用const修飾),在用已存在的類類型對象創(chuàng)建新對象時(shí)由編譯器自動調(diào)用。

拷貝構(gòu)造函數(shù)的函數(shù)名和構(gòu)造函數(shù)相同,無返回值,在參數(shù)上和構(gòu)造函數(shù)構(gòu)成重載。

2、拷貝構(gòu)造函數(shù)的參數(shù)

拷貝構(gòu)造函數(shù)的參數(shù)只有一個并且是類類型對象引用。如果使用傳值傳參的方式進(jìn)行拷貝構(gòu)造,在傳值的過程中實(shí)參需要拷貝一份數(shù)據(jù)給形參,這個過程需要調(diào)用拷貝構(gòu)造。形成層層傳值引發(fā)對象的拷貝的遞歸(有遞無歸)調(diào)用。

3、若未顯式定義,編譯器會生成默認(rèn)的拷貝構(gòu)造函數(shù)

默認(rèn)的構(gòu)造函數(shù)對于內(nèi)置類型按照字節(jié)拷貝。對于自定義類型則調(diào)用它的拷貝構(gòu)造函數(shù)。

4、拷貝構(gòu)造函數(shù)的深淺拷貝

通過默認(rèn)的拷貝構(gòu)造函數(shù)構(gòu)造的對象,按字節(jié)完成拷貝。這種拷貝被稱為淺拷貝(值拷貝)。

int main()
{
	Date d1(2022,9,24);
	Date d2(d1);
    return 0;
}

對于內(nèi)置類型,使用淺拷貝即可,系統(tǒng)默認(rèn)生成的就可以做到,所以我們不用動手寫拷貝構(gòu)造函數(shù)。注意這里有d1,d2兩個對象,當(dāng)main函數(shù)生命周期結(jié)束時(shí),這兩個對象均會發(fā)生一次析構(gòu),d2先析構(gòu),d1后析構(gòu)。(后定義的先銷毀,類似棧的后進(jìn)先出原則)

但是淺拷貝對于占用“資源”的成員變量時(shí)(例如成員變量中有動態(tài)開辟或fopen的資源),指針雖然復(fù)制了,但是所指向的內(nèi)容卻沒有復(fù)制,析構(gòu)時(shí)存在同一塊空間被釋放兩次的問題。需要進(jìn)行深拷貝。深拷貝的拷貝構(gòu)造函數(shù)必須自己手動實(shí)現(xiàn)。

class Stack
{
public:
	Stack(int capacity=100)//構(gòu)造函數(shù)
	{
		_capacity = capacity;
		_top = 0;
		_arr = (int*)malloc(sizeof(int) * 5);
		if (_arr == nullptr)
		{
			perror("malloc fail");
			exit(-1);
		}
	}
	//Stack(const Stack& st)//淺拷貝,棧這個類不能用淺拷貝
	//{
	//	_capacity = st._capacity;
	//	_top = st._top;
	//	_arr = st._arr;
	//}
	Stack(const Stack& st)//深拷貝
	{
		_capacity = st._capacity;
		_top = st._top;
		_arr = (int*)malloc(sizeof(int) * st._top);
		if (_arr == nullptr)
		{
			perror("malloc fail");
			exit(-1);
		}
		memcpy(_arr, st._arr,sizeof(int)*st._top);
	}
	~Stack()//析構(gòu)函數(shù)
	{
		_capacity = 0;
		_top = 0;
		free(_arr);
		_arr = nullptr;
	}
private:
	int* _arr;
	int _top;
	int _capacity;
};

棧這個類因?yàn)槌蓡T變量中有動態(tài)開辟的空間,所以要用深拷貝。

5、拷貝構(gòu)造函數(shù)調(diào)用場景

  • 1、使用已存在的對象創(chuàng)建新對象
  • 2、函數(shù)參數(shù)類型為類的類型對象(傳值調(diào)用,實(shí)參拷貝給形參)
  • 3、函數(shù)返回值類型為類的良心對象(傳值返回)

五、賦值運(yùn)算符重載Date& operator=(const Date& d )

1、賦值運(yùn)算符重載

只有賦值運(yùn)算符是默認(rèn)成員函數(shù)。

2、賦值運(yùn)算符重載的注意事項(xiàng)

  • 1、參數(shù)是const T&,傳引用可以減少一次拷貝構(gòu)造。
  • 2、返回值是*this的引用,引用返回,減少一次拷貝構(gòu)造,有返回值是為了支持函數(shù)的鏈?zhǔn)皆L問。
  • 3、務(wù)必檢查下是否支持自己給自己賦值。
  • 4、賦值運(yùn)算符重載必須是類中的默認(rèn)成員函數(shù),不能寫在全局。
  • 5、系統(tǒng)默認(rèn)生成的賦值運(yùn)算符重載會完成值拷貝。

六、取地址操作符重載和const取地址操作符重載

Date* operator&()
{
    return this;
    //return nullptr;
}
const Date* operator&()const
{
    return this;
    //return nullptr;
}

不用自己寫,除非想讓別人通過取地址操作符獲取到特定值(自己在重載函數(shù)內(nèi)部寫)或屏蔽類地址。

以上就是詳解C++中類的六大默認(rèn)成員函數(shù)的詳細(xì)內(nèi)容,更多關(guān)于C++類成員函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言中free函數(shù)的使用詳解

    C語言中free函數(shù)的使用詳解

    free函數(shù)是釋放之前某一次malloc函數(shù)申請的空間,而且只是釋放空間,并不改變指針的值。下面我們就來詳細(xì)探討下
    2017-05-05
  • C++的字符串分割函數(shù)的使用詳解

    C++的字符串分割函數(shù)的使用詳解

    本篇文章主要介紹了C++的字符串分割函數(shù),主要用strtok、STL、Boost進(jìn)行字符串分割,有需要的可以了解一下。
    2016-11-11
  • C++中std::optional的使用指南分享

    C++中std::optional的使用指南分享

    C++?17?引入了std::optional,表示一個可能有值的對象,這篇文章主要來和大家聊聊std::optional的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-06-06
  • C語言system 自動關(guān)機(jī)函數(shù)代碼

    C語言system 自動關(guān)機(jī)函數(shù)代碼

    這篇文章主要介紹了C語言system 自動關(guān)機(jī)函數(shù)代碼,需要的朋友可以參考下
    2016-04-04
  • C++中的 % 的含義說明

    C++中的 % 的含義說明

    很多朋友私信小編不理解C++中的 % 的含義,其實(shí)有兩種意思,一種是格式化字符串輸出另一種是整數(shù)取余,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2023-03-03
  • C語言實(shí)現(xiàn)貪吃蛇游戲代碼

    C語言實(shí)現(xiàn)貪吃蛇游戲代碼

    大家好,本篇文章主要講的是C語言實(shí)現(xiàn)貪吃蛇游戲代碼,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • C++ 類模板、函數(shù)模板全特化、偏特化的使用

    C++ 類模板、函數(shù)模板全特化、偏特化的使用

    這篇文章主要介紹了C++ 類模板、函數(shù)模板全特化、偏特化的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C語言實(shí)現(xiàn)點(diǎn)餐系統(tǒng)

    C語言實(shí)現(xiàn)點(diǎn)餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • c++實(shí)現(xiàn)簡單的線程池

    c++實(shí)現(xiàn)簡單的線程池

    本文介紹的線程池采用C++語言,在windows平臺下實(shí)現(xiàn)。本著技術(shù)分享的精神寫作本文同時(shí)公布源代碼。歡迎大家指出該線程池存在的問題并對當(dāng)前性能進(jìn)行討論。
    2015-03-03
  • 基于Qt實(shí)現(xiàn)一個圖片對比選擇瀏覽器

    基于Qt實(shí)現(xiàn)一個圖片對比選擇瀏覽器

    這篇文章主要為大家詳細(xì)介紹了如何基于Qt實(shí)現(xiàn)一個圖片對比選擇瀏覽器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04

最新評論

乌拉特中旗| 莱芜市| 林口县| 无棣县| 敦化市| 中江县| 乌兰浩特市| 汾阳市| 长岛县| 昂仁县| 旬邑县| 和政县| 马边| 肇源县| 柳州市| 精河县| 宁都县| 宜都市| 张家界市| 扬中市| 乌海市| 易门县| 治县。| 宝应县| 江津市| 宁都县| 渑池县| 普兰店市| 香格里拉县| 嘉兴市| 丽水市| 桂阳县| 临安市| 宁海县| 筠连县| 安泽县| 北海市| 来凤县| 牟定县| 明水县| 义马市|