1. 程式人生 > >string 類的傳統寫法與現代寫法

string 類的傳統寫法與現代寫法

傳統寫法

傳統寫法的 string 類,可讀性高

class String
{
public:
	String(const char* str = "")
	{
		//構造 string 類物件時,如果傳遞 nullptr 指標,認為程式非法
		if (str == nullptr)
		{
			assert(false);
			return;
		}
		_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)
		{
			char* pStr = new char[strlen(s._str) + 1];
			strcpy(pStr, s._str);
			delete[] _str;
			_str = pStr;
		}
		return *this;
	}
	//解構函式僅僅析構建構函式開闢出來的空間
	~String()
	{
		delete[] _str;
		_str = nullptr;
	}

private:
	char* _str;
};

現代寫法

現代寫法的 string類程式碼簡潔,new 與 delete 都在同一塊地方,程式碼維護性高

namespace mod
{
	class String
	{
	public:
		String(const char* str = "")
		{
			if (nullptr == str)
			{
				str = "";
			}
			_str = new char[strlen(str) + 1];
			strcpy(_str, str);
		}
		String(const String& s)
			: _str(nullptr)
		{
			String strTmp(s._str);
			swap(_str, strTmp._str);
		}
		String& operator=(String s)
		{
			swap(_str, s._str);
			return *this;
		}
		String& operator=(const String& s)
		{
			if (this != &s)
			{
				String strTmp(s._str);//用傳入引數構造當前物件,然後交換
				swap(_str, strTmp._str);
			}
		}
		~String()
		{
			delete[] _str;
			_str = nullptr;
		}
	private:
		char* _str;
	};
}