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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章