#include <iostream>
#include <cstring>
using namespace std;
class String{//String类
private:
char *str;//char数组 动态分配字符串内存
size_t length;//长度
public:
//构造函数,初始化字符串为空
String();
//有参构造 形参是字符串常量 初始化字符串为给定的字符串副本
String(const char *s);
//拷贝构造函数
String(const String& s);
//析构函数,释放动态分配的字符串内存空间
~String();
//获取字符串长度
size_t getLength() const;
//获取字符串索引
//operator做运算符的重载 作用是 在String类中的对象只要调用
//“[]”相当于调用这个函数
char operator[] (size_t index) const;
//重载赋值运算符
String &operator = (const String& s);
//重载等于运算符
bool operator == (const String& s) const;
//重载不等于运算符
bool operator != (const String& s) const;
//字符串拷贝
String copy() const;
//拼接字符串
String operator+(const String &s) const;
//重载<< 用来对字符串进行输出
friend ostream& operator<<(ostream &out,const String &s);
};
//拷贝构造函数
String::String(const String &s){
length = s.length;
str = new char[length - 1];
strcpy(str, s.str);
}
//构造函数,初始化字符串为空
//构造空字符串
String::String(){
length = 0;
str = new char[1];
str[0] = '\0';
}
//有参构造 s不改变
String::String(const char *s){
length = strlen(s);//获取s的长度
str = new char[length-1];//申请内存长度
strcpy(str,s);//将s内容拷贝进来
}
String::~String(){
delete[] str;
}
size_t String::getLength() const{//不会改变该类的成员变量 也就是length
return length;
}
char String::operator[](size_t index) const{//重载[] 返回str[index]
return str[index];
}
String &String::operator=(const String& s){//重载= 字符串赋值
if(this != &s){//右值不等于左值
delete[] str;
length = s.length;
str = new char[length + 1];
strcpy(str,s.str);
}
return *this;//右值等于左值
}
bool String::operator==(const String &s)const {//重载== 字符串比较
return strcmp(str,s.str) == 0;//strcmp接口
}
bool String::operator!=(const String &s)const{//重载!=
return strcmp(str,s.str) != 0;
}
String String::copy() const{//字符串拷贝 相当于赋值
String s(*this);
return s;
}
String String::operator+(const String&s) const{//字符串拼接
String result;
result.length = length + s.length;
result.str = new char[result.length + 1];
strcpy(result.str,str);
strcat(result.str,s.str);//拷贝到result的结尾
return result;
}
ostream& operator<<(ostream &out, const String&s){
cout << s.str;
return out;
}
int main() {
String s("12345d");
cout << s << endl;
cout << s + "445" << endl;
cout << s[5] << endl;
cout << (s == "12345d") << endl;
cout << (s != "12345d") << endl;
s = s + "asd";
String a,b,c;
a = b = c = s;
cout << s << endl;
cout << a << b << c << endl;
String x = s.copy();
cout << x <<endl;
return 0;
}
数据结构 字符串实现
最新推荐文章于 2024-11-17 20:44:56 发布