//所需知识点:
//strcpy(arg1,arg2)//会把arg2的内容赋值给arg1,直到'\0'为止,复制结束后会在arg1后加一个'\0';
//strlen();//返回字符串长度,只会返回‘\0’前字符串的长度,如"123\0qweqr" 返回值为3
//std::cin;//遇到空格或回车符就结束输入,遇到回车或eof会读入
//std::cout//遇到\0结束
class CString
{
public:
CString():m_data(nullptr){}
CString(const char*str)//构造函数
{
if (str==nullptr)
{
m_data = new char[1]{'\0'};
//strcpy(m_data, '\0');
}
else
{
auto len = strlen(str );
m_data = new char[1 + len] ;
strcpy(m_data,str );
}
}
CString(const CString&str)//拷贝构造
{
if (str.m_data == nullptr)
{
m_data = new char[1]{ '\0' };
}
else
{
auto len = strlen(str.m_data);
m_data = new char[len + 1];
strcpy(m_data, str.m_data);
}
}
CString(CString&&str) noexcept//移动构造
{
m_data = str.m_data;
str.m_data = nullptr;
}
~CString()
{
if (m_data != nullptr)
{
delete[]m_data;
m_data = nullptr;
}
}
public://工具函数
const char *CStr()
{
return m_data;
}
size_t size()
{
return strlen(m_data);
}
//操作符重载
public://只能定义为非成员函数
//输入输出运算符只能定义为非成员函数
friend std::ostream & operator <<(std::ostream&out, const CString &s);
friend std::istream& operator>>(std::istream&in, CString &s);
public://只能定义为成员函数
//赋值运算符必须定义为成员函数
CString& operator =(const CString& str)
{
if (this->m_data == str.m_data) return *this;
delete[] m_data;
auto len = strlen(str.m_data);
this->m_data = new char[len + 1];
strcpy(this->m_data,str.m_data);
return *this;
}
public://两者皆可
//通常情况下把算术运算符和关系运算符定义为非成员函数
friend CString operator + (const CString&v1, const CString&v2);
friend bool operator == (const CString&v1, const CString&v2);
//复合运算符一般定义为成员函数
CString & operator += (const CString&s)
{
*this = *this + s;
return *this;
}
//下标[]成员函数
char& operator[](size_t n)
{
auto len = strlen(this->m_data);
if (n >= len) return m_data[len-1];
return m_data[n];
}
//*
/*CString &operator * ()
{
return *this;
}*/
//& //编译器会默认生成
//->
private:
char * m_data;
};
std::ostream & operator <<(std::ostream&out, const CString &s)
{
out << s.m_data;
return out;
}
std::istream& operator>>(std::istream&in, CString &s)
{
if (s.m_data != nullptr)
delete[] s.m_data;
char buf[1024];
if (in >> buf )
{
auto len = strlen(buf);
s.m_data = new char[len + 1];
strcpy(s.m_data, buf);
}
else
s.m_data = nullptr;
return in;
}
CString operator + (const CString&v1, const CString&v2)
{
auto len1 = strlen(v1.m_data);
auto len2 = strlen(v2.m_data);
CString temp;
temp.m_data = new char[len1 + len2 + 1];
strcpy(temp.m_data, v1.m_data);
strcat(temp.m_data , v2.m_data);
return temp;
}
bool operator ==(const CString&v1, const CString&v2)
{
return strcmp(v1.m_data,v2.m_data)?false:true;
}