用C++重写String类,实现并不是最完美的,欢迎指正补充!后续还有更多类似的实现放上来, 欢迎关注!!!

/************************************************************************
用C++重写String类,实现并不是最完美的,欢迎指正补充!后续还有更多类似的实现放上来,
欢迎关注!!!
对本贴有更好的方法或建议可以给本人留言或发邮件:
Email:[email protected]
Thanks!
************************************************************************/

#include <iostream>//一般国际标准.iostream后不加.h
#include <ASSERT.H>//也可写成#include <assert.h>,大小写不限
using namespace std;

/*
//如果用#include <iostream.h> 后面就不用加using namespave std;
#include <iostream.h>
#include <ASSERT.H>
#include <string.h>
*/

class String
{
public:
	String(const char* str=NULL);//复制构造函数
	String(const String &other);//拷贝构造函数
	~String(void);				//析构函数
	String& operator=(const String& other);//赋值操作符重载
public:
	void PrintData();//打印m_data,m_data为私有成员变量,外部无法访问,只有通过尖类方法去访问
private:
	char* m_data;
};


String::String(const char* str)
{
	if (NULL == str)
	{
		m_data = new char[1];//给'\0' new一个字节的空间
		
		assert(NULL != m_data);
		
		*m_data = '\0';
	}
	else
	{
		int length = strlen(str);
		m_data = new char[length+1];//str不为NULL时要给m_data至少分配length+1个字节的空间
		
		assert(NULL != m_data);
		
		strcpy(m_data,str);
	}
}


String::String(const String& other)
{
	if (NULL == other.m_data)
	{
		m_data = new char[1];//给'\0' new一个字节的空间
		
		assert(NULL != m_data);
		
		*m_data = '\0';
	}
	else
	{
		int length = strlen(other.m_data);
		m_data = new char[length+1];//str不为NULL时要给m_data至少分配length+1个字节的空间
		
		assert(NULL != m_data);
		
		strcpy(m_data,other.m_data);
	}
}

String::~String(void)
{
	if (NULL != m_data)
	{
		delete[] m_data;
		m_data = NULL;//一定要让m_data指向NULL,否则为成为野指针,会造成程序崩溃
	}

	//cout << "析构完成" << endl;
}

void String::PrintData()
{
	cout << "m_data=" << m_data << endl;
	cout << strlen(m_data) << endl;
}


String& String::operator=(const String& other)
{
	if (this == &other)
	{
		return *this;
	}

	if (NULL != m_data)
	{
		//这里m_data不为NULL的话应该清除m_data的内容
		delete[] m_data;
		m_data = NULL;
	}
	
	int length = strlen(other.m_data);
	m_data = new char[length+1];
	
	assert(NULL != m_data);
	memset( m_data,0,sizeof(char)*(length+1));

	strcpy(m_data,other.m_data);

	return *this;//因为返回类型为String&引用类型,return *this
}





int main()
{
	String a("Hello World");
	String b;
	b = a;
	a.PrintData();
	b.PrintData();

	return 0;
}



你可能感兴趣的:(C++,c,String,null,delete,email)