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

C++深淺拷貝及簡(jiǎn)易string類(lèi)實(shí)現(xiàn)方式

 更新時(shí)間:2023年02月05日 15:20:40   作者:安河橋畔  
這篇文章主要介紹了C++深淺拷貝及簡(jiǎn)易string類(lèi)實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

三種拷貝方式

淺拷貝

對(duì)于自定義的string類(lèi),如果不顯式定義拷貝構(gòu)造函數(shù),編譯器會(huì)默認(rèn)生成拷貝構(gòu)造函數(shù),此時(shí)的拷貝方式是淺拷貝,兩個(gè)對(duì)象會(huì)公用一塊兒內(nèi)存,析構(gòu)時(shí)同一空間被釋放兩次,會(huì)導(dǎo)致程序崩潰。

賦值運(yùn)算符重載也會(huì)產(chǎn)生同樣的問(wèn)題,同時(shí),由于被賦值對(duì)象原來(lái)有空間,淺拷貝還會(huì)導(dǎo)致舊的空間無(wú)法找到,造成內(nèi)存泄漏。

深拷貝

類(lèi)中設(shè)計(jì)到資源的管理,拷貝構(gòu)造函數(shù)、賦值運(yùn)算符重載以及析構(gòu)函數(shù)都要顯示給出,按照深拷貝的方式。

深拷貝的方式讓每個(gè)對(duì)象都獨(dú)立擁有一份資源,不會(huì)造成多次釋放導(dǎo)致程序崩潰的問(wèn)題。

寫(xiě)時(shí)拷貝

寫(xiě)時(shí)拷貝是通過(guò)淺拷貝+引用計(jì)數(shù)的方式來(lái)實(shí)現(xiàn)的,引用計(jì)數(shù)是用來(lái)記錄資源的被引用的次數(shù),

可以將這種寫(xiě)時(shí)拷貝的機(jī)制想象成“拖延癥”,只有當(dāng)不得不進(jìn)行拷貝時(shí),才會(huì)開(kāi)辟新空間進(jìn)行拷貝

VS與GCC中的拷貝方式

Windows VS2022

VS中采用的是深拷貝的方式

Linux GCC

GCC編譯器采用的是寫(xiě)時(shí)拷貝的方式

簡(jiǎn)易string類(lèi)

簡(jiǎn)易string類(lèi)主要實(shí)現(xiàn)四個(gè)功能,即構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)、賦值運(yùn)算符重載,主要考察深淺拷貝

實(shí)現(xiàn)簡(jiǎn)易string類(lèi)有兩種代碼風(fēng)格,一種傳統(tǒng)版寫(xiě)法,代碼復(fù)用性第,可讀性較好;另一種稱(chēng)為現(xiàn)代版寫(xiě)法,代碼復(fù)用性高,但是較難理解。

傳統(tǒng)版寫(xiě)法的string類(lèi)

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

步驟:

  • 判斷是否為空指針,string類(lèi)不允許nullptr構(gòu)造對(duì)象
  • 申請(qǐng)新空間
  • 將字符串中的值拷貝到申請(qǐng)的空間
string(const char* str = "")
{
	if (nullptr == str)
	{
		assert(false);
		return;
	}
	//+1是因?yàn)橛?\0',strcpy會(huì)將源字符串中的'\0'拷貝到目標(biāo)空間
	_str = new char[strlen(str) + 1];
	strcpy(_str, str);
}

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

步驟:

  • 開(kāi)辟空間
  • 用源對(duì)象的_str給當(dāng)前對(duì)象的_str賦值
string(const string& s)
	:_str(new char[strlen(s._str) + 1])
{
	strcpy(_str, s._str);
}

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

步驟:

  • 判斷是否自己給自己賦值
  • 開(kāi)辟新空間
  • 拷貝元素
  • 刪除舊空間
string& operator=(const string& s)
{
	//避免自己給自己賦值
	if (this != &s)
	{
		char* temp = new char[strlen(s._str) + 1];
		strcpy(temp, s._str);
		delete[] _str;
		_str = temp;
	}
	return *this;
}

另一種寫(xiě)法

這種寫(xiě)法不用定義臨時(shí)變量,代碼相對(duì)簡(jiǎn)潔一點(diǎn),但是如果new申請(qǐng)空間失敗,舊的空間也無(wú)法找到。

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

步驟:

  • 釋放空間
  • 將指針置為空
~string()
{
?? ?if (_str)
?? ?{
?? ??? ?delete[]_str;
?? ??? ?_str = nullptr;
?? ?}
}

 

現(xiàn)代版寫(xiě)法string類(lèi)

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

string(const char* str = "")
{
	if (str == nullptr)
	{
		assert(false);
	}
	_str = new char[strlen(str) + 1];
	strcpy(_str, str);
}

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

拷貝構(gòu)造函數(shù)中利用構(gòu)造函數(shù),實(shí)現(xiàn)了代碼的復(fù)用

步驟:

  • 在初始化列表中將_str置為空
  • 定義一個(gè)臨時(shí)的string類(lèi)對(duì)象,指向要拷貝的對(duì)象相同位置
  • 交換臨時(shí)對(duì)象與當(dāng)前對(duì)象的_str
string(const string& s)
	:_str(nullptr)
{
	//調(diào)用構(gòu)造函數(shù)
	string temp(s._str);
	//交換以后temp指向空,函數(shù)退出后被銷(xiāo)毀
	swap(_str, temp._str);
}

賦值運(yùn)算符重載函數(shù)

步驟:

  • 判斷是否為自己給自己賦值
  • 調(diào)用拷貝構(gòu)造函數(shù)定義臨時(shí)變量
  • 交換臨時(shí)變量與當(dāng)前對(duì)象的_str
string& operator=(string& s)
{
	if (this != &s)
	{
		string temp(s);
		swap(_str, s._str);
	}
	return *this;
}

更簡(jiǎn)潔的寫(xiě)法:

string& operator=(string s)
{
	//傳參調(diào)用拷貝構(gòu)造函數(shù),不用判斷是否給自己賦值
	swap(_str, s._str);
	return *this;
}

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

~string()
{
	if (_str)
	{
		delete[] _str;
		_str = nullptr;
	}
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C/C++內(nèi)存管理之new與delete的使用及原理解析

    C/C++內(nèi)存管理之new與delete的使用及原理解析

    這篇文章主要介紹了C/C++內(nèi)存管理之new與delete的使用及原理解析,本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Qt實(shí)現(xiàn)文件的壓縮和解壓縮操作

    Qt實(shí)現(xiàn)文件的壓縮和解壓縮操作

    這篇文章主要為大家詳細(xì)介紹了如何使用Qt庫(kù)中的QZipReader和QZipWriter實(shí)現(xiàn)文件的壓縮和解壓縮功能,文中的示例代碼簡(jiǎn)潔易懂,需要的可以參考一下
    2024-12-12
  • 深入解析C++程序中激發(fā)事件和COM中的事件處理

    深入解析C++程序中激發(fā)事件和COM中的事件處理

    這篇文章主要介紹了深入解析C++程序中激發(fā)事件和COM中的事件處理,是C++事件操作的基礎(chǔ),需要的朋友可以參考下
    2016-01-01
  • C語(yǔ)言實(shí)現(xiàn)實(shí)時(shí)鐘表

    C語(yǔ)言實(shí)現(xiàn)實(shí)時(shí)鐘表

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)實(shí)時(shí)鐘表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++特性:迭代器

    C++特性:迭代器

    這篇文章主要介紹了C++特性:迭代器,本文主要通過(guò)介紹迭代器,迭代器和指針的區(qū)別,容器迭代器的使用等方面,需要的朋友可以參考下
    2021-06-06
  • Qt5連接并操作PostgreSQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    Qt5連接并操作PostgreSQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    本文主要介紹了Qt5連接并操作PostgreSQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 判斷機(jī)器大小端的兩種實(shí)現(xiàn)方法

    判斷機(jī)器大小端的兩種實(shí)現(xiàn)方法

    第一種方法,思路:利用指針的強(qiáng)制類(lèi)型轉(zhuǎn)換。第二種方法,思路:利用共用體所有數(shù)據(jù)都從同一地址開(kāi)始存儲(chǔ)。
    2013-03-03
  • C++面試八股文之override和finial關(guān)鍵字有何作用

    C++面試八股文之override和finial關(guān)鍵字有何作用

    C++11中的override和final關(guān)鍵字是為了增強(qiáng)代碼的編譯時(shí)類(lèi)型檢查和面向?qū)ο笤O(shè)計(jì)中的繼承機(jī)制,下面這篇文章主要給大家介紹了關(guān)于C++面試八股文之override和finial關(guān)鍵字有何作用的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 紅黑樹(shù)的使用詳解

    紅黑樹(shù)的使用詳解

    本篇文章是對(duì)紅黑樹(shù)的使用詳解。需要的朋友參考下
    2013-05-05
  • C/C++使用fmt庫(kù)實(shí)現(xiàn)格式化字符串

    C/C++使用fmt庫(kù)實(shí)現(xiàn)格式化字符串

    fmt庫(kù)是一個(gè)高效、易用的C++格式化庫(kù),可以幫助我們方便地進(jìn)行字符串格式化、輸出、日志記錄等操作,下面我們就來(lái)學(xué)習(xí)一下fmt格式化字符串的具體操作吧
    2023-12-12

最新評(píng)論

富蕴县| 双流县| 项城市| 顺义区| 洛南县| 清徐县| 瑞安市| 蒲城县| 杂多县| 阿坝| 靖远县| 赣州市| 定边县| 辛集市| 巴林左旗| 响水县| SHOW| 蓬溪县| 东阿县| 晋江市| 澎湖县| 呼图壁县| 高台县| 揭阳市| 镇江市| 新疆| 土默特左旗| 桐乡市| 文山县| 夏津县| 丰镇市| 绥江县| 休宁县| 岑溪市| 澎湖县| 象山县| 重庆市| 襄汾县| 城口县| 西藏| 镶黄旗|