世界新闻网是什么网站/怎么样建网站
前言
心血来潮想把string给实现一下,结果实现到一半失去兴趣,就把代码贴出来给大家参考一下吧,代码比较简单但是基本操作是没问题的
类的定义
class Mystring{
public:Mystring(const char* str = NULL);//通用构造函数Mystring(const Mystring& str);//拷贝构造~Mystring();//析构函数Mystring& operator=(const char* str);//赋值运算符,输入为字符串,返回引用Mystring& operator=(const Mystring& str);//赋值运算符,返回引用Mystring operator+(const Mystring& str) const;//+操作符,返回引用Mystring& operator+=(const Mystring& str);//+=操作符,返回引用bool operator!=(const Mystring& str);//!=操作符,返回引用bool operator<(const Mystring& str);//<操作符,返回引用char& operator[](int n) const;//下标操作符。返回引用bool operator==(const Mystring& str) const;//==运算符friend ostream& operator<<(ostream& os, const Mystring& s);//重载<<friend istream& operator>>(istream& is, Mystring& s);//重载>>int size() const;//字符串实际大小,不包括结束符const char* c_str() const;//将string转为char *bool empty();//检测字符串长度是否为0Mystring& substr(unsigned int begin, unsigned int len);//取子串void append(char c);//末尾追加字符private:char* data; //存放字符int length; //字符长度
};
函数实现
Mystring::Mystring(const char* str)//通用构造
{if (!str){//为空。String a()length = 0;data = new char[1];*data = '\0';}else{length = strlen(str);data = new char[length + 1];strcpy(data, str);}
}Mystring::Mystring(const Mystring& str)//拷贝构造,深拷贝
{length = str.size();data = new char[length + 1];strcpy(data, str.c_str());
}Mystring::~Mystring()
{delete[] data;data = NULL;length = 0;
}Mystring& Mystring::operator=(const char* str)
{if (!str){//为空length = 0;data = new char[1];*data = '\0';}else{length = strlen(str);data = new char[length + 1];strcpy(data, str);}return *this;
}Mystring& Mystring::operator=(const Mystring& str)
{if (this == &str) return *this;//赋值自身delete[] data;length = str.size();data = new char[length + 1];strcpy(data, str.c_str());return *this;
}
Mystring Mystring::operator+(const Mystring& str) const
{//新建对象包括新空间,拷贝两个数据,返回新空间Mystring newString;newString.length = length + str.size();newString.data = new char[newString.length + 1];strcpy(newString.data, data);strcat(newString.data, str.data);return newString;
}Mystring& Mystring::operator+=(const Mystring& str)
{length += str.size();char* newdata = new char[length + 1];strcpy(newdata, data);strcat(newdata, str.c_str());delete[] data;data = newdata;return *this;
}bool Mystring::operator!=(const Mystring& str)//!=操作
{if (length != str.size()) return true;return strcmp(data, str.c_str()) ? true : false;
}bool Mystring::operator<(const Mystring& str)//<操作
{return strcmp(data, str.c_str()) < 0;
}char& Mystring::operator[](int n) const
{//下标操作符,返回引用if (n >= length) {perror("下标越界!");return data[length - 1];//如果越界,返回最后一个字符}else return data[n];
}bool Mystring::operator==(const Mystring& str) const
{if (length != str.size()) return false;return strcmp(data, str.c_str()) ? false : true;
}ostream& operator<<(ostream& os, const Mystring& s)
{os << s.data;return os;
}
istream& operator>>(istream& is, Mystring& s)
{char buffer[9000];is >> buffer;s.data = buffer;s.length = strlen(buffer);return is;
}int Mystring::size() const
{return length;
}const char* Mystring::c_str() const
{return data;
}bool Mystring::empty() {return length == 0;
}
Mystring& Mystring::substr(unsigned int begin, unsigned int len) {char* newdata = new char[len + 1];data[begin + len] = '\0';for (int i = 0; i < len; i++)newdata[i] = data[begin + i];newdata[len] = '\0';delete[] data;data = newdata;length = len;return *this;
}
void Mystring::append(char c) {char* newdata = new char[length + 2];strcpy(newdata, data);newdata[length] = c;newdata[length + 1] = '\0';delete[] data;data = newdata;length++;
}