C++ String类的实现

本文详细介绍了如何从零开始实现一个简单的String类。包括构造函数、析构函数、字符串连接、赋值操作、下标访问等功能,并通过重载运算符实现了类的便捷使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

训练下实现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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值