数据结构 字符串实现

#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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值