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

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

 更新時(shí)間:2022年03月10日 17:26:47   作者:平凡的指針  
這篇文章主要為大家詳細(xì)介紹了C++深淺拷貝和string類的兩種寫法,文中示例代碼介紹的非常詳細(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);
	}
	//采用淺拷貝寫的構(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)然是重新開一塊和別人同樣大小的空間,然后再把別人空間里面的內(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);
	}
	//采用深拷貝寫的構(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類的兩種寫法

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

1. 傳統(tǒng)寫法

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

//搞一個(gè)命名空間,里面實(shí)現(xiàn)自己寫的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àn)代寫法就是復(fù)用其它的函數(shù),自己不用干活,交給其它函數(shù)來(lái)幫你實(shí)現(xiàn),代碼如下:

//現(xiàn)代寫法:拷貝構(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語(yǔ)言的abs()函數(shù)和div()函數(shù)你了解嗎

    C語(yǔ)言的abs()函數(shù)和div()函數(shù)你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的abs()函數(shù)和div()函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++ sort排序之降序、升序使用總結(jié)

    C++ sort排序之降序、升序使用總結(jié)

    這篇文章主要介紹了C++ sort 排序(降序、升序)使用總結(jié),需要的朋友可以參考下
    2020-11-11
  • C++輸出上三角/下三角/菱形/楊輝三角形(實(shí)現(xiàn)代碼)

    C++輸出上三角/下三角/菱形/楊輝三角形(實(shí)現(xiàn)代碼)

    本篇文章是對(duì)C++中輸出上三角/下三角/菱形/楊輝三角形的示例代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • C++多態(tài)特性之派生與虛函數(shù)與模板詳細(xì)介紹

    C++多態(tài)特性之派生與虛函數(shù)與模板詳細(xì)介紹

    這篇文章主要介紹了C++多態(tài)的特性派生與虛函數(shù)與模板,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • C++解析wav文件方法介紹

    C++解析wav文件方法介紹

    最近將項(xiàng)目改為跨平臺(tái),于是音頻模塊從微軟的XAudio2改用OpenAL庫(kù)。之前使用MSDN的代碼,所以現(xiàn)在改為了C++標(biāo)準(zhǔn)的寫法,適用性更廣
    2022-09-09
  • 詳解c++優(yōu)先隊(duì)列priority_queue的用法

    詳解c++優(yōu)先隊(duì)列priority_queue的用法

    本文詳細(xì)講解了c++優(yōu)先隊(duì)列priority_queue的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C++虛函數(shù)注意事項(xiàng)

    C++虛函數(shù)注意事項(xiàng)

    這篇文章主要給大家分享了EC++虛函數(shù)注意事項(xiàng),
    2022-01-01
  • C++中 靜態(tài)局部變量實(shí)例詳解

    C++中 靜態(tài)局部變量實(shí)例詳解

    這篇文章主要介紹了C++中 靜態(tài)局部變量實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • QT實(shí)現(xiàn)貪吃蛇游戲代碼詳解

    QT實(shí)現(xiàn)貪吃蛇游戲代碼詳解

    本文主要為大家詳細(xì)介紹了在QT中實(shí)現(xiàn)貪吃蛇游戲的詳細(xì)教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Qt私有信號(hào)實(shí)現(xiàn)(private signal)

    Qt私有信號(hào)實(shí)現(xiàn)(private signal)

    在使用Qt信號(hào)槽機(jī)制的時(shí)候,有時(shí)候我們需要一個(gè)信號(hào)只能由類內(nèi)發(fā)出,而不允許使用該類對(duì)象的用戶發(fā)出,此時(shí)就需要私有信號(hào)的支持,本文主要介紹了Qt私有信號(hào)實(shí)現(xiàn)(private signal),感興趣的可以了解一下
    2023-10-10

最新評(píng)論