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;
	};
}

 

你可能感兴趣的:(【c/c++】)