#include <ostream>
#include <istream>
#include <string.h>
#include "_stringv2.h"
using std::ostream;
using std::istream;
String::String():
_cstr(NULL),
_used(new size_t(1)),
_length(0),
_capacity(0)
{
}
String::String(const String &s):
_cstr(s._cstr),
_used(s._used),
_length(s._length),
_capacity(s._capacity)
{
++*_used;
}
String::String(const char *cstr)
{
if(cstr == NULL)
return;
size_t len = strlen(cstr);
_initString(cstr, len);
}
String::String(const char *cstr, size_t len)
{
if(cstr == NULL)
return;
size_t str_len = strlen(cstr);
if(len <= str_len)
{
_initString(cstr, len);
}
}
String::~String()
{
_decUsed();
}
String& String::operator=(const String &s)
{
++*(s._used);
_decUsed();
_cstr = s._cstr;
_length = s._length;
_capacity = s._capacity;
return *this;
}
String& String::operator=(const char *cstr)
{
if(cstr != NULL)
{
_decUsed();
size_t len = strlen(cstr);
_initString(cstr, len);
}
return *this;
}
String& String::operator+=(const String &s)
{
_addAssignOpt(s._cstr, s._length);
return *this;
}
String& String::operator+=(const char *cstr)
{
if(cstr != NULL)
_addAssignOpt(cstr, strlen(cstr));
return *this;
}
void String::clear()
{
_decUsed();
_cstr = NULL;
_used = new size_t(1);
_length = 0;
_capacity = 0;
}
void String::_initString(const char *cstr, size_t len)
{
if(cstr == NULL)
return;
_cstr = new char[len + 1];
memcpy(_cstr, cstr, len);
_cstr[len] = 0;
_used = new size_t(1);
_length = len;
_capacity = len;
}
void String::_decUsed()
{
--*_used;
if(*_used == 0)
{
if(_cstr != NULL)
{
delete[] _cstr;
_cstr = NULL;
_length = 0;
_capacity = 0;
}
delete _used;
_used = NULL;
}
}
char* String::_renewAndCat(const char *cstr, size_t len)
{
size_t new_len = len + _length;
size_t capacity = new_len;
capacity += (capacity >> 1);
char *ptr = new char[capacity+1];
if(_cstr != NULL)
memcpy(ptr, _cstr, _length);
ptr[_length] = 0;
_length = new_len;
_capacity = capacity;
strncat(ptr, cstr, len);
return ptr;
}
void String::_addString(const char *cstr, size_t len)
{
//本函数,只有在引用计数为1时,才可用
if(*_used != 1)
return;
if(len + _length > _capacity)
{
char *ptr = _renewAndCat(cstr, len);
delete[] _cstr;
_cstr = ptr;
}
else
{
strncat(_cstr, cstr, len);
_length += len;
}
}
void String::_addAssignOpt(const char *cstr, size_t len)
{
if(*_used == 1)
_addString(cstr, len);
else
{
_decUsed();
_cstr = _renewAndCat(cstr, len);
_used = new size_t(1);
}
}
String operator +(const String &lhs, const String &rhs)
{
String stemp(lhs);
stemp += rhs;
return stemp;
}
ostream& operator << (ostream &os, const String &s)
{
os<<s.cstr();
return os;
}
istream& operator >> (istream &in, String &s)
{
const int BUFFER_SIZE = 256;
char buffer[BUFFER_SIZE];
char *end = buffer + BUFFER_SIZE -1;
s.clear();
do
{
//用于判断是否读完输入内容,因为如果还未读取的输入字符数大于buffer
//的容量,则buffer的最后一个字符会被get函数置为'\0'
*end = '#';
in.get(buffer, BUFFER_SIZE);
s += buffer;
}while(*end == '\0');
in.get();
return in;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
string.zip (3个子文件)
string
_stringv2.cpp 4KB
main.cpp 393B
_stringv2.h 1KB
共 3 条
- 1
资源评论
- TIGERJASON2015-10-17讲解的很不错,学习了!!
- AdonLee2015-04-10总体来说,觉得隐式共享写时拷贝还是很有用的~~这个文档中对string类中的一些构造函数、析构函数以及操作符等都有设计。
- mhqssyh2015-01-18没怎么看明白smart point 的思想在这里是什么意思,是在哪里用的指针在哪里收回吗?
ljianhui
- 粉丝: 2949
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功