实现类string构造函数、 拷贝构造函数、赋值函数、析构函数、运算符重载、字符串反转、排序

实现类string构造函数、 拷贝构造函数、赋值函数、析构函数、运算符重载、字符串反转、排序,补全其中的函数实现部分(请勿改动其他代码)

#include<iostream>
#define _CRT_SECURE_NO_DEPRECATE   //vs编译器可能不支持sprintf,strcpy等函数


/*
实现类string构造函数、 拷贝构造函数、赋值函数、析构函数、运算符重载、字符串反转、排序,补全其中的函数实现部分(请勿改动其他代码)
*/
class string
{

private:
	char* m_data;
	int m_length;

public:

//1.默认构造函数 

/*
string()   
{
m_data = new char[1];
m_data[0] = '\0';
}
*/

 /*******************************************/

//2.构造函数
 string (const char*src=NULL)
 {
	 //TODO1:构造函数
	 //开始添加代码
 if (src== NULL)
 {
	m_data=new char[1];
	m_data[0]='\0';
	m_length=0;
 }
 else
 {
   m_length= strlen(src);
   m_data = new char[m_length+1];
   strcpy(m_data,src);
 }
 //结束添加代码
 }

 /*****************************************/

 //3.析构函数
 ~string()
 {
	 //TODO2:析构函数
	 //开始添加代码
 if (m_data != NULL)   //将堆区开辟的数据做释放操作
 {
   delete[]m_data;        //释放指针指向的内存
   m_data = NULL;         //置空,防止野指针的出现
 }
 //结束添加代码
 }

 /**************************************/

 //4.求字符串长度
 int size()const
 {
	 return m_length;
 }

 /****************************************/

 const char*c_src()const
 {
		return m_data;
 }


 /*************************************/

 //5.拷贝构造函数
 string(const string &src)
 {
	 //TODO3:拷贝构造函数
	 //开始添加代码

 m_length=src.m_length;
 m_data = new char[m_length + 1];  //深拷贝
 strcpy(m_data, src.m_data);
 
 //结束添加代码
 }

 /***************************************/

 //6.重载赋值运算符
 string & operator=(const string & other)
 {
		if (this != &other)//自检查,防止自己赋值给自己
	  {
		delete[]m_data;//删除原来的内存资源
		m_length = other.m_length;
		m_data = new char[m_length+ 1];
		strcpy(m_data, other.m_data);
 }
	   return *this;
 }

 /*************************************************/

 //7.重载“+”运算符
 string operator+(const string &src)const
 {
	 string ret;
 //TODO4:运算符+
 //开始添加代码

 ret.m_data = new char[this->m_length + src.m_length + 1];
 sprintf(ret.m_data,"%s%s",this->m_data,src.m_data);
 ret.m_length = this->m_length + src.m_length;  //如果没有这句,str5.size()为0

 //结束添加代码
 return ret;
 }

 /**********************************************/

 //8.重载“+=”运算符
 string & operator+=(const string&src)
 {
	 //TODO5:运算符+=
	 //开始添加代码

 string ret1;

 ret1.m_data = new char[this->m_length+ 1];
 strcpy(ret1.m_data,this->m_data);
 ret1.m_length = this->m_length;

 this->m_data = new char[ret1.m_length+ src.m_length+ 1];
 sprintf(this->m_data,"%s%s",ret1.m_data,src.m_data);
 this->m_length = ret1.m_length + src.m_length;

 //结束添加代码
return *this; //返回自身
 }

 /************************************************/

 //9.重载“==”运算符
 bool operator== (const string& src)const
 {
	 //TODO5:运算符==
	 //开始添加代码
 if (strcmp(this->m_data,src.m_data) == 0)
 {
 return true;
 }
 else
 {
 return false;
 }
 //结束添加代码
 }

 /************************************************/

 //10.类内实现字符串反转
 void reverse()
	 {
	 //TODO5:字符串反转
	 //开始添加代码
 for (int i = 0,j = m_length - 1; i < j; i++,j--)
 {
 char c = m_data[i];
 m_data[i] = m_data[j];
 m_data[j] = c;
 }
   //结束添加代码
 }

 /**************************************************/
 
 void swap(char&a, char&b)
 {
    char c = a;
	a = b;
	b = c;
 }

 //11.类内实现排序
void sort()
{
	 //TODO6:字符串从小到大排序
	 //开始添加代码
	for (int i = m_length - 1; i > 0; i--)
	{
		for (int j = 0; j < i; j++)
		{
			if (m_data[j] > m_data[j + 1])
			{
				swap(m_data[j], m_data[j + 1]);
			}
		}
     }
	 //结束添加代码
 }
};



int main()
{
	//构造函数
	string str1="abcde";
	string str2("12345");

	//拷贝构造函数
	string str3 = str1;
	std::cout<<(str3== str1) << std::endl;                        //输出为1

	//拷贝构造函数
	string str4(str2);
	std::cout<<(str2==str4) << std::endl;                         //输出为1

	//+ 运算符
	string str5=str1+str2;
	std::cout<<(str5== "abcde12345") << std::endl;              //输出为1        
	
	std::cout << (str5.size()== str1.size()+str2.size()) << std::endl;  //输出为1

	//+= 运算符
	str5+=str1;
	std::cout << (str5== "abcde12345abcde") << std::endl;      //输出为1     
	std::cout << "str5的长度为:" << str5.size() << std::endl; //输出为15

	//反转
	string str6= "12345678";
	str6.reverse();
	std::cout <<(str6=="87654321") << std::endl;            //输出为1

	//排序
	string str7= "202008131617";
	str7.sort();
	std::cout << (str7== "000111223678") << std::endl;
	system("pause");
	return 0;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值