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

C++深淺拷貝及簡易string類實現(xiàn)方式

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

三種拷貝方式

淺拷貝

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

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

深拷貝

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

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

寫時拷貝

寫時拷貝是通過淺拷貝+引用計數(shù)的方式來實現(xiàn)的,引用計數(shù)是用來記錄資源的被引用的次數(shù),

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

VS與GCC中的拷貝方式

Windows VS2022

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

Linux GCC

GCC編譯器采用的是寫時拷貝的方式

簡易string類

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

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

傳統(tǒng)版寫法的string類

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

步驟:

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

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

步驟:

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

賦值運算符重載

步驟:

  • 判斷是否自己給自己賦值
  • 開辟新空間
  • 拷貝元素
  • 刪除舊空間
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;
}

另一種寫法

這種寫法不用定義臨時變量,代碼相對簡潔一點,但是如果new申請空間失敗,舊的空間也無法找到。

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

步驟:

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

 

現(xiàn)代版寫法string類

構(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ù),實現(xiàn)了代碼的復(fù)用

步驟:

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

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

步驟:

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

更簡潔的寫法:

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é)

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

相關(guān)文章

  • C語言實現(xiàn)登錄注冊和忘記密碼功能

    C語言實現(xiàn)登錄注冊和忘記密碼功能

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)登錄、注冊和忘記密碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 使用c++實現(xiàn)異或加密的代碼示例

    使用c++實現(xiàn)異或加密的代碼示例

    這篇文章主要為大家介紹了c++實現(xiàn)異或加密的代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • C語言實現(xiàn)無規(guī)律數(shù)據(jù)加密、解密功能

    C語言實現(xiàn)無規(guī)律數(shù)據(jù)加密、解密功能

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)無規(guī)律數(shù)據(jù)加密、解密功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C++求解二叉樹的下一個結(jié)點問題

    C++求解二叉樹的下一個結(jié)點問題

    本文將通過C++求解以下問題:給定一個二叉樹其中的一個結(jié)點,請找出中序遍歷順序的下一個結(jié)點并且返回。文中示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-04-04
  • C語言求解最長公共子字符串問題及相關(guān)的算法分析

    C語言求解最長公共子字符串問題及相關(guān)的算法分析

    最長公共子字符串問題即是求一個字符串在另一個字符串中出現(xiàn)的連續(xù)最多字符,這里我們來看一下面試中經(jīng)常出現(xiàn)的C語言求解最長公共子字符串問題及相關(guān)的算法分析
    2016-06-06
  • 數(shù)組和指針的區(qū)別深入剖析

    數(shù)組和指針的區(qū)別深入剖析

    在C/C++中,指針和數(shù)組在很多地方可以互換使用,這使得我們產(chǎn)生一種錯覺,感覺數(shù)組和指針兩者是完全等價的,事實上數(shù)組和指針是有很大的區(qū)別的
    2012-11-11
  • Qt5實現(xiàn)文本編輯器(附詳細(xì)代碼)

    Qt5實現(xiàn)文本編輯器(附詳細(xì)代碼)

    QT是一個跨平臺的GUI開發(fā)框架,我使用的QT5 C++版本的,本文主要介紹了Qt5實現(xiàn)文本編輯器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • VSCode同時更改所有相同的變量名或類名的圖文教程

    VSCode同時更改所有相同的變量名或類名的圖文教程

    這篇文章主要介紹了VSCode同時更改所有相同的變量名或類名,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C++超細(xì)致講解隊列queue的使用

    C++超細(xì)致講解隊列queue的使用

    隊列先進(jìn)先出,即只能在容器的末尾添加新元素,只能從頭部移除元素,下面這篇文章主要給大家介紹了關(guān)于C++中隊列queue用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • vs2022啟動一個CmakeLists.txt項目的實踐

    vs2022啟動一個CmakeLists.txt項目的實踐

    本文主要介紹了vs2022啟動一個CmakeLists.txt項目的實踐,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06

最新評論