class CString {
public:
int GetLength() const{
return strlen(m_pData);
}
CString(const char* p);
CString(const CString &str); //拷贝字符串
CString(char ch,int nRepeat); //串内有N个ch字符
CString(const char* cstr,int nLenght); //根据字符串常量取一部分字符
CString();
![](/qrcode.jpg)
~CString();
friend CString operator+(const CString &str1,const CString &str2);
CString &operator=(const CString &str); //重载赋值符号只能在类成员区域;
CString &operator=(const char *str); //连== 赋值 ,立案等必须要有返回值,它就是用返回值去继续赋值;
operator const char* (){return m_pData;}
friend std::ostream &operator<<(std::ostream &cout,CString &str);
friend bool operator!=(const CString& str1,const CString& str2);
friend bool operator!=(const char* str1,const CString& str2);
friend bool operator!=(const CString& str1,const char* str2);
friend bool operator==(const CString& str1,const CString& str2);
friend bool operator<(const CString& str1,const CString& str2);
friend bool operator>(const CString& str1,const CString& str2);
friend bool operator<=(const CString& str1,const CString& str2);
friend bool operator>=(const CString& str1,const CString& str2);
char operator[](int nIndex) const;
CString &operator+=(const CString& str);
private:
int a;
char* m_pData;
};
CString ---- CPP
#include "CString.hpp"
#include <iostream>
CString::CString(char ch,int nRepeat){
m_pData = new char[nRepeat+1];
memset(m_pData, ch, nRepeat);
m_pData[nRepeat] = '\0';
}
CString::CString(const char* cstr,int nLenght){
int nlen = strlen(cstr); //求出字符串长度
if (nlen > nLenght)
nlen = nLenght;
m_pData = new char[nlen+1];
memcpy(m_pData, cstr,nlen);
m_pData[nlen] = '\0';
}
std::ostream &operator<<(std::ostream &out,CString &str){
//输出的自定义输出符号
out << str.m_pData;
return out;
}
CString operator+(const CString &str1,const CString &str2)
{
int n = str1.GetLength()+str2.GetLength();
CString str;
str.m_pData = new char[n+1]; // 这里的意思是申请所需长度的字节数然后在加一个0结束符字节 所以表示为n+1 个字节数;
strcpy(str.m_pData, str1.m_pData);
strcat(str.m_pData, str2.m_pData);
return str;
}
CString &CString::operator=(const CString &str){
int nLen = str.GetLength();
//首先判断当前的字符串长度是不是大于str字符串的长度 如果说大于那就先delete在strcopy
//再重新建立一个更长的空间
if(GetLength() < nLen){
delete []m_pData;
m_pData = new char(nLen+1); //根据对方的长度重新申请一个空间
strcmp(m_pData, str.m_pData);
}
strcmp(m_pData, str.m_pData);
return *this;
}
CString::CString(const char* p){
//定一个变量记录长度
int nLen = strlen(p);
m_pData = new char[nLen+1];
strcpy(m_pData, p);
}
CString::CString(const CString &str){
int nLen = str.GetLength();
//m_pData = str.m_pData; //浅拷贝这是属于;
m_pData = new char[nLen+1]; //深拷贝
strcpy(m_pData, str.m_pData);
}
CString &CString::operator=(const char *str){
//首先获取字符串长度
int nLen = strlen(str);
//判断字符串长度是不是
if (nLen > GetLength()) {
//如果str字符串长度大于GetLenght现有的字符串长度的时候就删除现有的字符串重新分配空间
delete []m_pData;
m_pData = new char[nLen+1];
}
strcpy(m_pData, str);
return *this;
}
bool operator!=(const CString& str1,const CString& str2){
return strcmp(str1.m_pData, str2.m_pData) != 0;
}
bool operator!=(const char* str1,const CString& str2){
return strcmp(str1, str2.m_pData) !=0;
}
bool operator!=(const CString& str1,const char* str2){
return strcmp(str1.m_pData, str2) !=0;
}
bool operator==(const CString& str1,const CString& str2){
return strcmp(str1.m_pData, str2.m_pData) == 0;
}
bool operator<(const CString& str1,const CString& str2){
return strcmp(str1.m_pData, str2.m_pData) < 0;
}
bool operator>(const CString& str1,const CString& str2){
return strcmp(str1.m_pData, str2.m_pData) > 0;
}
bool operator<=(const CString& str1,const CString& str2){
return strcmp(str1.m_pData, str2.m_pData) <= 0;
}
bool operator>=(const CString& str1,const CString& str2){
return strcmp(str1.m_pData, str2.m_pData) >= 0;
}
char CString::operator[](int nIndex) const{
return m_pData[nIndex];
}
CString &CString::operator+=(const CString& str){
int nLen = GetLength()+str.GetLength();
char *p = new char[nLen+1];
strcpy(p,m_pData);
strcat(p, str.m_pData);
delete []m_pData; //删除旧的空间
m_pData = p;
return *this;
}
CString::CString(){
m_pData = new char(0); //在堆空间上申请一个字节
}
CString::~CString(){
//删除堆空间
delete m_pData;
}
CPP ---- main
int main(int argc, const char * argv[]) {
CString s1 = "abc",s2 = "-xyz";
s1 += s2;
std::cout << s1 << std::endl;
return 0;
}
/*
int main(int argc, const char * argv[]) {
CString s4("All rights reserved",8); //截断方式字符串
CString s1 = "abc",s2 = "-xyz";
//CString s = s1+s2;
CString s = s1; //深拷贝
CString s3('*',8);
// s1 = s2; //直接赋值是属于浅拷贝
CString s5;
s5 = s4 = "123456";
if (s1 == s4)
std::cout << "相等" << std::endl;
else
std::cout << "不相等" << std::endl;
if ("123456" != s4)
std::cout << "不等" << std::endl;
else
std::cout << "相等" << std::endl;
int i = 0;
while (i < s.GetLength()) {
printf("%c",s[i]);
++i;
}
std::cout << s1 << std::endl;
std::cout << s2 << std::endl;
std::cout << s << std::endl;
std::cout << s4 << std::endl;
printf("%d \n",s1.GetLength());
printf("%d \n",s2.GetLength());
std::cout << s.GetLength() << std::endl;
std::cout << s3 << std::endl;
std::cout << s4 << "\n" << s5 << std::endl;
//类型转换字符串
const char *p = s1; //C++字符串与C语言字符串;
return 0;
}
*/