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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值