string类

#include<iostream>
#pragma warning(disable:4996)
using namespace std;

//class String
//{
//public:
// String(char* str = " ")
// :_str(new char[strlen(str) + 1]) //多一个字节存‘\0’
// , _pRefcount(new int(1)) //开辟一个int空间初始化为1
// {
// strcpy(_str, str);
// }
//
// String(const String& s)
// :_str(s._str)
// , _pRefcount(s._pRefcount)
// {
// ++(*_pRefcount);
// }
// ~String()
// {
// _Release();
// }
//
// String& operator=(const String& s)
// {
// if (this != &s)
// {
// _Release();
// _str = s._str;
// _pRefcount = s._pRefcount;
// ++(*_pRefcount);
// }
// return *this;
// }
//
// char& operator[](size_t index)
// {
// if (*_pRefcount > 1)
// {
// --(*_pRefcount);
// // copy on write
// char* tmp = new char[strlen(_str) + 1];
// strcpy(tmp, _str);
// _str = tmp;
// _pRefcount = new int(1);
// }
// return _str[index];
// }
//
// friend ostream& operator<<(ostream& out, const String& s);
// 
//private:
// void _Release()
// {
// if ((--(*_pRefcount) == 0) && _str)
// {
// delete[] _str;
// delete _pRefcount;
// }
// }
//
//private:
// char* _str;
// int* _pRefcount; //引用计数
//};
//
//ostream& operator<<(ostream& out, const String& s)
//{
// out << s._str << endl;
// return out;
//}

**//优化版**
class String
{
public:
    String(char* str = " ")
        :_str(new char[strlen(str) + 5])
    {
        _str += 4;
        strcpy(_str, str);
        _GetRefCount(_str) = 1;
    }
    String(const String& s)
        :_str(s._str)
    {
        ++_GetRefCount(_str);
    }
    ~String()
    {
        _Release();
    }

    String& operator=(const String& s)
    {
        if (this != &s)
        {
            _Release();
            _str = s._str;
            ++_GetRefCount(_str);
        }
        return *this;
    }

    char& operator[](size_t index)
    {
        if (_GetRefCount(_str) > 1)
        {
            --_GetRefCount(_str);
            char* tmp = new char[strlen(_str) + 5];
            tmp += 4;
            strcpy(tmp, _str);
            _str = tmp;
            _GetRefCount(_str) = 1;
        }
        return _str[index];
    }
private:
    int& _GetRefCount(char* ptr)
    {
        return *(int*)(ptr - 4);
    }
    void _Release()
    {
        if (--_GetRefCount(_str) == 0)
        {
            delete[](_str - 4);
        }
    }


    friend ostream& operator<<(ostream& out, const String& s);

private:
    char* _str;
};

ostream& operator<<(ostream& out, const String& s)
{
    out << s._str << endl;
    return out;
}

void Test()
{
    String s1("abcd");
    //String s2(s1);
    s1[0] = 'f';
    cout << s1;
    //cout << s2;

}
void Test1()
{
    String s1("abcd");
    String s2;
    cout << s2;
    String s3(s2);

    s2 = s1;// s2.operator=(&s2,s1)
    cout << s2;
    cout<<s3<<endl;
}


int main()
{
    Test();
    //Test1();
    getchar();
    return 0;
}

你可能感兴趣的:(String类,引用计数,写时拷贝)