实现类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;
}