自定义String类

本文详细介绍了一个自定义的MyString类的实现过程,包括构造函数、析构函数、赋值运算符重载等核心成员函数,并实现了字符串比较、拼接等功能。通过具体的代码示例展示了如何使用该自定义字符串类。

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

//一个自建的MyString类
#include <iostream>
#include <cstring>
using namespace std;
class String{
    private:
        char * str;
        int len;
        static int num_strings;//number of objects;
    public:
        //constructors and other methods;
        String(const char* s);//constructor
        String();//default constructor
        String(const String &);//copy constructor
        ~String();//destructor
        int length() const {return len;}

        //overloaded operator methods
        String & operator=(const String &);
        String & operator=(const char*);
        char & operator[](int i);
        const char & operator[](int i) const;
    //  String & operator + (String & ) ;//overloaded +(改变被加对象)

        //overloaded operator friends;
        friend bool operator<(const String &st1, const String &st2); 
        friend bool operator>(const String &st1, const String &st2); 
        friend bool operator==(const String &st1, const String &st2); 
        friend ostream & operator<<(ostream & os, const String &st);
        friend String & operator+(String & left, String & right); 

        //static function
        static int HowMany();   
}; 

//initializing static class member
int String::num_strings=0;

//static method
int String::HowMany(){
    return num_strings;
}

//class methods
String::String(const char * s){ //construct String from C string
    len=strlen(s);
    str=new char[len+1];
    strcpy(str,s);
    num_strings++;
}

String::String(){//default constructor
    len=0;
    str=new char[1];//不适用new char,是为了与析构函数delete []str兼容
    str[0]='\0';   //default string
    num_strings++;
}

String::String(const String & st){//copy constructor
    num_strings++;
    len=st.len;
    str=new char[len+1];
    strcpy(str,st.str);
}

String::~String(){
    --num_strings;
    delete [] str;
}

//overloaded operator methods
String & String::operator=(const String & st){//assign a String to a String
    if(this==&st)
    return *this;
    if(str!=NULL)
    delete [] str;//先释放当前对象的堆内存 
    len=strlen(st.str);
    str=new char[len+1];//然后分配足够大小长度的堆内存复制字符串 
    strcpy(str,st.str);
    return *this;
}

/*
String & String::operator +(String & st) //重载+ (改变被加对象) 
{
    char * temp=str;
    str=new char[strlen(temp)+strlen(st.str)+1];
    strcpy(str,temp);     //复制第一个字符 
    delete [] temp;
    strcat(str,st.str);   //连接第二个字符 
    return *this;
} 
*/
//assign a C string to a String
String & String::operator=(const char * s){
    delete [] str;
    len=strlen(s);
    str=new char[len+1];
    strcpy(str,s);
    return * this;
}

//read-write char access for non-const String
char & String::operator[](int i){
    return str[i];
}

//read-only char access for const String
const char & String::operator[](int i) const{
    return str[i];
}

//overloaded operator friends
bool operator<(const String &st1,const String &st2){
    return strcmp(st1.str,st2.str)<0;
}

bool operator>(const String &st1,const String &st2){
    return st2<st1;
}

bool operator==(const String & st1, const String & st2)
{
    return strcmp(st1.str,st2.str)==0;
}

//simple String output
ostream & operator<<(ostream & os, const String & st){
    os<<st.str;
    return os;
}


//友元实现重载+,不改变被加对象 
 String & operator+(String & left, String & right)
 {
    String *pString=new String(" ");
     pString->str=new char[strlen(left.str)+strlen(right.str)+1];
     strcpy(pString->str,left.str);
     strcat(pString->str,right.str); 
     return *pString;
 }

 int main(){
    String a("hello ");
    String b("world\n");
    String c=a+b;
    cout<<a<<b;
     cout<<"overloaded +: "<<c;
     cout<<"operator []:"<<c[4]<<endl;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值