< String.h>
#ifndef __STRING_H__
#define __STRING_H__
#include <iostream>
#include <assert.h>
class String
{
public:
String(const char* str = ""); //构造函数
String(const String& copy); //拷贝构造
~String(); //析构函数
String& operator=(String assign); //赋值函数
char& operator[](size_t pos); //
const char& operator[](size_t pos)const;
char* c_str(); //获取字符串首地址
int* GetCount(); //获取指向同一块空间类的个数
void Release(); //删除
void CopyAtWrite(); //写时拷贝
private:
char* _str;
};
#endif;
< String.cpp >
#include "String.h"
using namespace std;
String::String(const char* str) //构造函数
{
if (str == nullptr) //传的地址是nullptr
{
_str = new char[5];
_str += 4;
*_str = '\0';
*GetCount() = 0;
}
else
{
_str = new char[strlen(str) + 5];
_str += 4;
*GetCount() = 1;
strcpy(_str, str);
}
}
String::String(const String& copy) //拷贝构造函数
:_str(copy._str)
{
(*GetCount())++;
}
String::~String()
{
Release();
}
//s2 = s1
String& String::operator=(String assign) //赋值函数
{
if (_str != assign._str) //防止给自己赋值
{
Release();
_str = assign._str;
++(*GetCount());
}
return *this;
}
char& String::operator[](size_t pos)
{
CopyAtWrite();
return _str[pos];
}
char* String::c_str()
{
return _str;
}
const char& String::operator[](size_t pos)const
{
return _str[pos];
}
int* String::GetCount()
{
return ((int*)(_str - 4));
}
void String::Release()
{
if (--(*GetCount()) == 0)
{
delete[] GetCount();
_str = nullptr;
}
}
void String::CopyAtWrite()
{
if (*GetCount() > 1)
{
(*GetCount())--;
char* NewStr = new char[strlen(_str + 5)];
strcpy(NewStr, _str);
_str = NewStr + 4;
*GetCount() = 1;
}
}