string类

写法一:

class String
{
public:
	String()//构造函数,当str为空字符串时
	{
		_str = new char[1];
		*_str = '\0';
		cout << "string()" << endl;
	}
	String(char* str)//构造函数
		:_str(new char[strlen(str + 1)])//strlen求字符串大小,不包括‘\0’,故+1留下/0空间
	{
		strcpy(_str, str);
		cout << "构造" << endl;

	}
	~String()//析构函数
	{
		delete[]_str;//new[]要用delete[]释放
		cout << "析构" << endl;

	}
	String(const String& str)//拷贝构造函数
		:_str(new char[strlen(str._str) + 1])
	{
		strcpy(_str, str._str);
		cout << "拷贝" << endl;
	}
	String& operator=(const String& str)//重载=
	{
		if (this != &str)//判断自赋值
		{
			delete[]_str;//释放原空间
			_str = new char[strlen(str._str) + 1];//开辟新空间
			strcpy(_str, str._str);//复制
			return *this;
		}
		cout << "重载" << endl;

	}
private:
	char* _str;
};

写法二:

简化
class String
{
public:
	String()//构造函数,当str为空字符串时
	{
		_str = new char[1];
		*_str = '\0';
		cout << "string()" << endl;
	}
	String(char* str)//构造函数
		:_str(new char[strlen(str + 1)])//strlen求字符串大小,不包括‘\0’,故+1留下/0空间
	{
		strcpy(_str, str);
		cout << "构造" << endl;

	}
	~String()//析构函数
	{
		delete[]_str;//new[]要用delete[]释放
		cout << "析构" << endl;

	}
	String(const String& str)//拷贝构造函数
		:_str(NULL)
	{
		String tmp(str._str);
		swap(_str, tmp._str);
	}
	//String& operator=(const String& str)//写法一
	//{
	//	if (this != &str)//判断自赋值
	//	{
	//		String tmp(_str);
	//		swap(_str, tmp._str);
	//	}
	//	cout << "重载" << endl;
	//	return*this;
	//}
	String& operator=(String str)//写法二    
	{
		swap(_str, str._str);
		return *this;
	}
	bool operator==(const String& s)
	{

	}
private:
	char* _str;
};

写法三:

class String
{
public:
	String(char*str="")
		:_str(new char[strlen(str)+5])
	{
		*(int*)_str = 1;
		_str += 4;
		strcpy(_str, str);
	}
	~String()
	{
		if (_str != NULL)
		{
			if (--*(int*)(_str - 4))
			{
				delete[](_str - 4);
			}
		}
	}
	String(const String& str)
		:_str(str._str)
	{
		++*(int*)(_str - 4);
	}
	String& operator=(const String& str)
	{
		if (this != &str)//自赋值检查
		{
			if (--*(int*)(_str - 4) == 0)
			{
				delete[](_str - 4);
			}
			_str = str._str;
			++*(int*)(_str - 4);
		}
		return *this;
	}
private:
	char *_str;
};