实现自己的string类(string 类重写)

#include <iostream>
#include <assert.h>
#include <string.h>

using namespace std;

class String
{
	public:
	//String():str(NULL){std::cout<< "String()"<<std::endl;};    // 1 Sting s; 走这里
	//String(const char* pStr);                                  // 2 Sting s(str); 走这里
	String(const char* pStr = NULL);                         // 3   这个声明是与 1 有冲突的,应为都是 可以无参传入,所以有问题, Sting s; Sting s(str);都是走这里
	String(String&);
	String& operator=(const String&);
	String& operator+(const String&);                           //cat

	~String();
	
	void print(void);

	private:
		char* str;
};

String::String(const char* pStr)
{

	//unsigned int strLen;
	if(pStr == NULL)
	{
		std::cout<< "fun = " <<__FUNCTION__<< ", line = " << __LINE__ <<std::endl;
		String::str = new char;
		*String::str = '\0';
	}
	else
	{
		std::cout<< "fun = " <<__FUNCTION__<< ", line = " << __LINE__ <<std::endl;
		//strLen = strlen(pStr)+1;
		//String::str = new char[strLen];
		String::str = new char[strlen(pStr)+1];
		strcpy(String::str, pStr);
		//memcpy(String::str, pStr, strLen);
	}
}

String::~String()
{
	std::cout<< " ~String() " <<std::endl;
	if(str) delete[] String::str;
}

String::String(String& tStr)
{
	std::cout<< " copy construct " <<std::endl;
	String::str = new char[strlen(tStr.str)+1];
	assert ( String::str != NULL );
	strcpy(String::str, tStr.str);
}

String& String::operator+(const String & src)
{
	std::cout<< " operator + " <<std::endl;

	int len = strlen(src.m_str) + strlen(m_str) + 1;


	char* str = new char[len];
	assert ( str != NULL );
	memset(str,0,sizeof(char)*len);
	strcpy(str,m_str);
	strcpy(str+strlen(m_str), src.m_str);

	if ( m_str != NULL)
	{
		delete[] m_str;
	}
	m_str = str;

	return *this;
}

void String::print(void)
{
	std::cout<< "str = " << "\"" << str << "\"" <<std::endl;
}

String& String::operator = (const String & object)
{
	std::cout<< " operator = " <<std::endl;

	if (this == &object )
	{
		return *this;
	}
	if ( String::str != NULL)
	{
		delete[] str;
		str = NULL;
	}
	int length = strlen(object.str)+1;
	str = new char[length];
	assert ( str != NULL );
	memset(str,0,sizeof(char)*length);
	strcpy(str,object.str);
	return *this;
} 

int main(void)
{
	{
		std::cout <<std::endl;
		std::cout << "case 1 :" <<std::endl;
		String s;
		s.print();
	}

	{
		std::cout <<std::endl;
		std::cout << "case 2 :" <<std::endl;
		const char* ss = "123abc1";
		String s(ss);
		s.print();
	}

	{
		std::cout <<std::endl;
		std::cout << "case 3 :" <<std::endl;
		const char* ss = "123abc2";
		std::cout<< ss <<std::endl;
		String s(ss);
		s.print();

		//
		String s1(s);
		s1.print();
	}

	{
		std::cout << std::endl;
		std::cout << "case 4 :" << std::endl;
		const char* ss = "123abc3";
		std::cout<< ss <<std::endl;
		String s(ss);
		s.print();

		String s1; //
		s1.operator=(s); // 赋值语句也可以写成 s1 = s;
		s1.print();
	}

	{
		std::cout <<std::endl;
		std::cout << "case 4 :" <<std::endl;
		const char* ss = "123abc";
		String s(ss);
		String s1=s;
		s1 = s1+s;
		s1.print();
	}
	std::cout<< " " <<std::endl;

	return 0;
}

//调试环境 linux g++

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值