#include <stdio.h>
#include <string.h>
class String
{
private:
struct StringValue
{
int refCount;
char *data;
StringValue(const char *initValue);
~StringValue();
};
StringValue *value;
public:
String(const char *initValue = ""); //constructor
String(const String &rhs); //copy constructor
String &operator=(const String &rhs); //assignment operator
const char &operator[](size_t index) const; //重载[]运算符,针对const Strings
char &operator[](size_t index); //重载[]运算符,针对non-const Strings
~String(); //destructor
};
String::StringValue::StringValue(const char *initValue) : refCount(1)
{
data = new char[strlen(initValue) + 1];
strcpy_s(data, 1, initValue);
}
String::StringValue::~StringValue()
{
delete[] data;
}
String::String(const char *initValue) : value(new StringValue(initValue))
{
}
String::String(const String &rhs) : value(rhs.value)
{
++value->refCount;
}
String::~String()
{
if (--value->refCount == 0)
delete value;
}
String &String::operator=(const String &rhs)
{
if (this->value == rhs.value) //自赋值
return *this;
//赋值时左操作数引用计数减1,当变为0时,没有指针指向该内存,销毁
if (--value->refCount == 0)
delete value;
//不必开辟新内存空间,只要让指针指向同一块内存,并把该内存块的引用计数加1
value = rhs.value;
++value->refCount;
return *this;
}
const char &String::operator[](size_t index) const
{
return value->data[index];
}
//重载[]运算符,针对non-const Strings
char &String::operator[](size_t index)
{
if (value->refCount > 1)
{
--value->refCount;
value = new StringValue(value->data);
}
if (index < strlen(value->data))
return value->data[index];
}
#include <iostream>
#include <string>
using namespace std;
std::string a = "lvlv";
void main()
{
char *p = &a[1];
*p = 'a';
std::string b = a;
std::cout << "b:" << b << endl;
system("pause");
return;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)