训练下实现String类。要完全写好还是有很多细节要注意的。
#include <stdio.h>
#include<iostream>
class string{
friend std::ostream& operator<<(std::ostream& os,const string &a);//必须声明为友元函数,不是成员函数,返回的是ostream对象
friend std::istream& operator>>(std::istream& is,const string &a);
public:
string(const char *str = nullptr); //构造函数
string(const string &str); //复制构造函数
~string();//析构函数
string &operator = (const string &rhs);//字符串赋值
string operator + (const string &rhs)const;//字符串连接
string& operator+=(const string &rhs);//字符串连接简写
bool operator == (const string &rhs)const;// 字符串判断相等
char &operator [](const size_t t);// 下标访问返回引用
size_t length()const;
string substr(int start,int num)const;//substr实现
private:
char *Array;
};
string::string(const char *str){ //默认构造函数
if(str==nullptr){
Array = new char[1];
Array[0] = '\0';
}
else{
Array = new char[strlen(str)+1];
for(int i=0; i<strlen(str); ++i)
Array[i] = str[i];
Array[strlen(str)]='\0';
}
}
string::string(const string &str){ //赋值构造函数
Array = new char[strlen(str.Array)+1];
strcpy(Array,str.Array);
}
string::~string(){ //析构函数
delete[]Array; //删除Array的一组对象,和delete对比
}
string string:: operator + (const string &rhs)const{//字符串连接,相同的类可以访问private
string newString;
if(!rhs.Array)
newString = *this;
else if(!Array)
newString = rhs;//判断是否是加空字符串
else
{
newString.Array = new char[strlen(Array)+strlen(rhs.Array)+1];
strcpy(newString.Array,Array);
strcpy(newString.Array+strlen(Array),rhs.Array);
}
return newString;
}
string& string::operator+=(const string &rhs){
string temp = *this+rhs;
*this = temp;
return *this;
}
bool string::operator==(const string &rhs)const{
return strcmp(this->Array,rhs.Array)==0;
}
string& string::operator=(const string &rhs){
delete []Array;
Array = new char[strlen(rhs.Array)+1];
strcpy(Array,rhs.Array);
return *this;
}
char& string::operator[](const size_t t){
return Array[t];
}
size_t string::length()const{
return strlen(Array);
}
string string::substr(int start,int num)const{
string res;
res.Array = new char[num];
for(int i=0; i<num; ++i){
if(start+i>this->length()){ //防止越界
res.Array[i] = '\0';
return res;
}
else
res.Array[i] = Array[start+i];
}
return res;
}
std::ostream & operator<<(std::ostream &os,const string &a){ //没有在string域作用符,因为不是成员函数
os<<a.Array;
return os;
}
std::istream &operator>>( std::istream &input, string &s )
{
char temp[ 255 ]; //用于存储输入流
input>>temp;
s = temp; //使用赋值运算符
return input; //使用return可以支持连续使用>>运算符
}
int main(){
string a;
std::cin>>a;
string b = "HelloCiao";
string c("TestCompleted");
string d = b.substr(2,4);
a += b;
b[2]='k';
std::cout<<c[2]<<','<<a<<','<<b<<','<<c<<','<<d<<','<<a+b;
return 0;
}