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

C++深淺拷貝和string類的兩種寫(xiě)法詳解

 更新時(shí)間:2022年03月10日 17:26:47   作者:平凡的指針  
這篇文章主要為大家詳細(xì)介紹了C++深淺拷貝和string類的兩種寫(xiě)法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

一、深淺拷貝

拷貝這個(gè)詞對(duì)于我們來(lái)說(shuō)應(yīng)該不陌生,比如我們平常的復(fù)制和粘貼就是拷貝;但是如果把拷貝這個(gè)詞放到C++中來(lái)說(shuō)就有一些復(fù)雜了,我們先來(lái)看一下什么是淺拷貝:

下面用字符串類來(lái)模擬實(shí)現(xiàn)。

class Astring
{
public:
	//構(gòu)造函數(shù)
	Astring(const char* str = "")
	{
		_str = new char[strlen(str) + 1];
		strcpy(_str, str);
	}
	//采用淺拷貝寫(xiě)的構(gòu)造函數(shù)
	Astring(const Astring& s)
	{
		_str = s._str;
	}
	//析構(gòu)函數(shù)
	~Astring()
	{
		delete[] _str;
		_str = nullptr;
	}
private:
	char* _str;
};
int main()
{
	Astring aa("hello C++");
	Astring bb(aa); //這里調(diào)用拷貝構(gòu)造
	return 0;
}

當(dāng)我們執(zhí)行以上程序的話就會(huì)失敗,結(jié)果如下:

在這里插入圖片描述

分析如下圖所示:

在這里插入圖片描述

所以我們采用淺拷貝使用同一塊空間是不行了,那么怎么辦呢?當(dāng)然是重新開(kāi)一塊和別人同樣大小的空間,然后再把別人空間里面的內(nèi)容給拷貝過(guò)來(lái),而這樣就是所謂的深拷貝了;我們還是用字符串類來(lái)模擬實(shí)現(xiàn)深拷貝:

class Astring
{
public:
	//構(gòu)造函數(shù)
	Astring(const char* str = "")
	{
		_str = new char[strlen(str) + 1];
		strcpy(_str, str);
	}
	//采用深拷貝寫(xiě)的構(gòu)造函數(shù)
	Astring(const Astring& s)
	{
		_str = new char[strlen(s._str) + 1];
		strcpy(_str, s._str);
	}
	//析構(gòu)函數(shù)
	~Astring()
	{
		delete[] _str;
		_str = nullptr;
	}
private:
	char* _str;
};

int main()
{
	Astring aa("hello C++");
	Astring bb(aa);
	return 0;
}

分析如下圖所示:

在這里插入圖片描述

二、string類的兩種寫(xiě)法

有了上面我們知道的深淺拷貝,所以我們明白類中的拷貝構(gòu)造函數(shù)和賦值重載一定要用深拷貝來(lái)實(shí)現(xiàn),不過(guò)拷貝構(gòu)造函數(shù)和賦值重載還是有兩種寫(xiě)法的。

1. 傳統(tǒng)寫(xiě)法

傳統(tǒng)寫(xiě)法就是要自己開(kāi)辟空間自己來(lái)拷貝別人的東西,什么事情都要自己干,代碼如下:

//搞一個(gè)命名空間,里面實(shí)現(xiàn)自己寫(xiě)的string類
namespace cjy
{
	class string
	{
	public:
		//構(gòu)造函數(shù)
		string(const char* str = "")
			:_str(new char[strlen(str) + 1])
		{
			strcpy(_str, str);
		}
		//拷貝構(gòu)造函數(shù)
		string(string& s)
			:_str(new char[strlen(s._str) + 1])
		{
			strcpy(_str, s._str);
		}
		//賦值重載,s1=s3
		string& operator=(const string& s)
		{
			if (this != &s)
			{
				char* tmp = new char[strlen(s._str) + 1];
				delete[] _str;
				_str = tmp;
				strcpy(_str, s._str);
			}
			return *this;
		}
		//析構(gòu)函數(shù)
		~string()
		{
			delete[] _str;
			_str = nullptr;
		}
	private:
		char* _str;
	};
}

2. 現(xiàn)代寫(xiě)法

現(xiàn)代寫(xiě)法就是復(fù)用其它的函數(shù),自己不用干活,交給其它函數(shù)來(lái)幫你實(shí)現(xiàn),代碼如下:

//現(xiàn)代寫(xiě)法:拷貝構(gòu)造、賦值重載函數(shù)
namespace cjy
{
	class string
	{
	public:
		//構(gòu)造函數(shù)
		string(const char* str = "")
		{
			_str = new char[strlen(str) + 1];
			strcpy(_str, str);
		}
		//拷貝構(gòu)造函數(shù)
		string(const string& s)
			:_str(nullptr)
		{
			string tmp(s._str);
			std::swap(_str, tmp._str);
     	}
		//賦值重載
		string& operator=(string s)
		{
			std::swap(_str, s._str);
			return *this;
		}
	private:
		char* _str;
	};
}

分析如下圖所示:

在這里插入圖片描述

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容! 

相關(guān)文章

  • C++?Boost?Accumulators累加器詳細(xì)講解

    C++?Boost?Accumulators累加器詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • 帶你了解C++this指針的用法及其深究

    帶你了解C++this指針的用法及其深究

    這篇文章主要介紹了C++中this指針的用法,對(duì)初學(xué)者而言是非常重要的概念,必須加以熟練掌握,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • 解析C++多文件編程問(wèn)題

    解析C++多文件編程問(wèn)題

    在某些場(chǎng)景中,考慮到編譯效率和可移植性,#pragma once 和 #ifndef 經(jīng)常被結(jié)合使用來(lái)避免頭文件被 重復(fù)引入,這里介紹用 _Pragma 操作符避免頭文件重復(fù)引入的問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2021-10-10
  • C語(yǔ)言簡(jiǎn)明介紹指針的使用

    C語(yǔ)言簡(jiǎn)明介紹指針的使用

    C語(yǔ)言這門課程在計(jì)算機(jī)的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語(yǔ)言的學(xué)習(xí),對(duì)指針的掌握是非常重要的,本文將具體針對(duì)指針的基礎(chǔ)做詳盡的介紹
    2022-06-06
  • C++實(shí)現(xiàn)字符串刪除字符后逆序輸出

    C++實(shí)現(xiàn)字符串刪除字符后逆序輸出

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)字符串刪除字符后逆序輸出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語(yǔ)言中帶返回值的宏定義方式

    C語(yǔ)言中帶返回值的宏定義方式

    這篇文章主要介紹了C語(yǔ)言中帶返回值的宏定義方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++?LeetCode1769移動(dòng)所有球到每個(gè)盒子最小操作數(shù)示例

    C++?LeetCode1769移動(dòng)所有球到每個(gè)盒子最小操作數(shù)示例

    這篇文章主要為大家介紹了C++?LeetCode1769移動(dòng)所有球到每個(gè)盒子所需最小操作數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • vscode遠(yuǎn)程連接服務(wù)器(免密登錄+遠(yuǎn)程開(kāi)發(fā))

    vscode遠(yuǎn)程連接服務(wù)器(免密登錄+遠(yuǎn)程開(kāi)發(fā))

    vscode的遠(yuǎn)程連接功能十分方便,本文就來(lái)介紹一下vscode遠(yuǎn)程連接服務(wù)器,主要包括免密登錄和遠(yuǎn)程開(kāi)發(fā),感興趣的可以了解一下
    2024-07-07
  • C語(yǔ)言變長(zhǎng)數(shù)組使用詳解

    C語(yǔ)言變長(zhǎng)數(shù)組使用詳解

    這篇文章主要介紹了C語(yǔ)言變長(zhǎng)數(shù)組使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • C語(yǔ)言入門篇--初識(shí)C語(yǔ)言及數(shù)據(jù)類型

    C語(yǔ)言入門篇--初識(shí)C語(yǔ)言及數(shù)據(jù)類型

    本篇文章是c語(yǔ)言基礎(chǔ)篇,主要為大家介紹了C語(yǔ)言的基本類型,為大家介紹了什么是C語(yǔ)言,希望可以幫助大家快速入門c語(yǔ)言的世界,更好的理解c語(yǔ)言
    2021-08-08

最新評(píng)論

舒城县| 嘉荫县| 平凉市| 宣威市| 闽清县| 德庆县| 静宁县| 台湾省| 宁化县| 朝阳市| 华亭县| 含山县| 上杭县| 望谟县| 霍山县| 东莞市| 长垣县| 凤庆县| 鄢陵县| 布尔津县| 珲春市| 白河县| 广西| 大丰市| 罗山县| 永新县| 蒲江县| 靖宇县| 思茅市| 海阳市| 扬州市| 寻乌县| 台江县| 巴塘县| 龙山县| 永平县| 岢岚县| 平泉县| 甘孜县| 普格县| 连平县|