< 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; } }