模拟实现String类

来源:互联网 发布:电视机网络电视怎么调 编辑:程序博客网 时间:2024/06/06 09:00

String类模拟实现:

#include <iostream>#include <assert.h>#include <string.h>using namespace std;class String{public:    String(char* str = "")    {        _size = strlen(str);        _str = new char[_size+1];        strcpy(_str,str);    }    String(const String& str)    {        _size = strlen(str._str);        _str = new char[_size+1];        strcpy(_str,str._str);    }    String& operator=(const String& str)    {        String tmp(str._str);        char* p = tmp._str;        tmp._str = _str;        _str = p;        _size = tmp._size;        return *this;    }    ~String()    {        if (_str)        {            delete[] _str;            _size = 0;        }    }    void DisPlay()    {        cout<<_str<<"->"<<_size<<endl;    }    size_t Size()const//返回对象    {        return _size;    }    char& operator[](size_t index)    {        assert(index<_size);        return _str[index-1];    }    String operator+(const String& s)    {        char* p = new char[strlen(_str)+strlen(s._str)+1];        strcpy(p,_str);        strcat(p,s._str);        String tmp(p);        delete p;        return tmp;    }    bool operator>(const String& s)    {        char* p1 = _str;        char* p2 = s._str;        while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0'))        {            *p1++;            *p2++;        }        if ((*p1 - *p2)>0)        {            return 1;        }        return 0;    }    bool operator<(const String& s)    {        char* p2 = _str;        char* p1 = s._str;        while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0'))        {            *p1++;            *p2++;        }        if ((*p1 - *p2)>0)        {            return 1;        }        return 0;    }    bool operator==(const String& s)    {        char* p2 = _str;        char* p1 = s._str;        while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0'))        {            *p1++;            *p2++;        }        if ((*p1 == '\0')&&(*p2 == '\0'))        {            return 1;        }        return 0;    }    bool operator!=(const String& s)    {        char* p2 = _str;        char* p1 = s._str;        while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0'))        {            *p1++;            *p2++;        }        if ((*p1 == '\0')&&(*p2 == '\0'))        {            return 0;        }        return 1;    }    const char* C_Str()const//返回类中的字符串    {        return _str;    }    String SubStr(size_t pos, size_t n)//返回一个对象的子串对象    {        char* p = new char[n+1];        strncpy(p,_str+pos-1,n);        p[n]='\0';        String tmp(p);        delete p;        return tmp;    }protected:private:    char* _str;    size_t _size;};

测试代码:

void Test1()//测试构造,拷贝构造,复制重载{    String str("hello ");    str.DisPlay();    String str1(str);    str1.DisPlay();    String str2 = str1;    str2.DisPlay();}void Test2()//测试下标运算符[],和加法运算符+的重载{    String str("hello ");    String str1("world ");    String str2("private");    str2 = str + str1;    str2.DisPlay();    cout<<str[2]<<endl;}void Test3()//测试关系运算符 >, <, ==, !=, 的重载{    String str("hello ");    String str1("world ");    String str2("hello ");    if (str > str1)    {        cout<<"str 大于 str1"<<endl;    }    else    {        cout<<"str 不大于 str1"<<endl;    }    if (str < str1)    {        cout<<"str 小于 str1"<<endl;    }    else    {        cout<<"str 不小于 str1"<<endl;    }    if (str == str2)    {        cout<<"str 等于 str2"<<endl;    }    else    {        cout<<"str 不等于 str2"<<endl;    }       if (str1 != str2)    {        cout<<"str 不等于 str2"<<endl;    }    else    {        cout<<"str 等于 str2"<<endl;    }}void Test4(){    String str("hello ");    String str1("world ");    const char * pstr = str1.C_Str();    cout<<pstr<<endl;    str1 = str.SubStr(2,4);    str1.DisPlay();}int main(){    Test1();    Test2();    Test3();    Test4();    return 0;}

浅拷贝和深拷贝

  在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。

深拷贝:
在进行拷贝的过程中,新开辟一块空间,然后将要拷贝的内容放到新开辟的空间里,
这里写图片描述

对另一个对象进行赋值时,要根据赋值对象,对被赋值对象的空间进行调整,这时候就要用到深拷贝。

原创粉丝点击