C++:String物件的構造及深拷貝

慕白昂發表於2020-10-06

C++中String物件的構造以及深拷貝

拷貝構造的實現方式

  1. 先釋放掉_str的記憶體,然後再申請一個要拷貝的記憶體空間,再將原物件的值拷貝到目標物件中
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<list>
#include<assert.h>
#include<vld.h>
using namespace std;

namespace bit
{
	class string
	{
	public:
		string(const char* str = "")
		{
			if (nullptr == str)
				_str = new char[1]{ '\0' };
			else
			{
				_str = new char[strlen(str) + 1];
				strcpy(_str, str);
			}
		}

		string(const string &s)
		{
			_str = new char[strlen(s._str) + 1];
			strcpy(_str, s._str);
		}
		string& operator=(const string &s)
		{
			if (this != &s)
			{
				delete[]_str;
				_str = new char[strlen(s._str) + 1];
				strcpy(_str, s._str);
			}
			return *this;
		}
		~string()
		{
			if (_str)
			{
				delete[] _str;
				_str = nullptr;
			}
		}
	private:
		char* _str;
	};
};
int main()
{
	bit::string str(nullptr);
	bit::string str1("abc");
	bit::string str2;
	str2 = str1;
	system("pause");
	return 0;
}

在這裡插入圖片描述

  1. 構造一個臨時物件,再交換兩個容器內所有元素,再返回交換後的_str物件的值
string& operator=(const string &s)
		{
			if (this != &s)
			{
				string tmp_str(s);    //臨時物件
				swap(_str, tmp_str._str);
			}
			return *this;
		}
	

在這裡插入圖片描述

  1. 為了防止因申請空間失敗而破壞要拷貝的原物件,對第一種方法進行改進
string& operator=(const string &s)
		{
			if (this != &s)
			{
				char *tmp_str = new char[strlen(s._str) + 1];  //ERROR
				delete[]_str;
				_str = tmp_str;
				strcpy(_str, s._str);
			}
			return *this;
		}

在這裡插入圖片描述

相關文章