String类的写时拷贝实例
发布时间 - 2026-01-10 22:36:52 点击率:次实例如下:
#include<iostream>
using namespace std;
class String;
ostream& operator<<(ostream &out, const String&s);
//引用计数器类
class String_rep
{
friend class String;
friend ostream& operator<<(ostream &out, const String&s);
public:
String_rep(const char *str )
:use_count(0)
{
if (str == NULL)
{
data = new char[1];
data[0] = '\0';
}
else
{
data = new char[strlen(str) + 1];
strcpy(data, str);
}
}
String_rep(const String_rep &rep) :use_count(0)
{
data = new char[strlen(rep.data) + 1];
strcpy(data, rep.data);
}
String_rep& operator=(const String_rep &rep)
{
if (this != &rep)
{
delete[]data;
data = new char[strlen(rep.data) + 1];
strcpy(data, rep.data);
}
return *this;
}
~String_rep()
{
delete[]data;
data = NULL;
}
public:
void increase()
{
++use_count;
}
void decrease()
{
if (use_count == 0)
{
delete this; //自杀行为 释放this所指的空间,在释放之前调动这个类的析构函数
}
}
private:
char *data;
int use_count;
};
////////////////////////////////////////////////////////////////////////////////////////
class String
{
friend ostream& operator<<(ostream &out, const String&s);
public:
String(const char* str = " ")
{
rep = new String_rep(str);
rep->increase();
}
String(const String &s)
{
rep = s.rep; //浅拷贝
rep->increase();
}
String& operator=(const String &s)
{
if (this != &s)
{
rep->decrease(); //模拟delete
rep = s.rep; //模拟new
rep->increase(); //模拟strcpy
/*rep = s.rep; //这会更改引用计数器指针 ,造成s内存泄漏
rep->increase();*/
}
return *this;
}
~String()
{
rep->decrease();
}
public:
void to_upper()
{
if (rep->use_count > 1)
{
String_rep* new_rep = new String_rep(rep->data);
rep->decrease();
rep = new_rep;
rep->increase();
}
char* ch = rep->data;
while (*ch != '\0')
{
*ch -= 32;
++ch;
}
}
private:
String_rep *rep; //引用计数器
};
ostream& operator<<(ostream &out, const String&s)
{
out << s.rep->data;
return out;
}
void main()
{
String s1("hello");
String s2(s1);
String s3;
s3 = s2;
cout << "s1=" << s1 << endl;
cout << "s2=" << s2 << endl;
cout << "s3=" << s3 << endl;
s2.to_upper();
cout << "-----------------------------------------------" << endl;
cout << "s1=" << s1 << endl;
cout << "s2=" << s2 << endl;
cout << "s3=" << s3 << endl;
}
以上这篇String类的写时拷贝实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# c
# string
# 拷贝
# 标准C++类string的Copy-On-Write技术
# 给大家
# 希望能
# 这篇
# 这会
# 小编
# 大家多多
# std
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
JS实现鼠标移上去显示图片或微信二维码
奇安信“盘古石”团队突破 iOS 26.1 提权
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
个人网站制作流程图片大全,个人网站如何注销?
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
如何基于PHP生成高效IDC网络公司建站源码?
长沙企业网站制作哪家好,长沙水业集团官方网站?
iOS正则表达式验证手机号、邮箱、身份证号等
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
JavaScript如何操作视频_媒体API怎么控制播放
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
详解CentOS6.5 安装 MySQL5.1.71的方法
如何在阿里云完成域名注册与建站?
如何快速完成中国万网建站详细流程?
如何在阿里云高效完成企业建站全流程?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
bootstrap日历插件datetimepicker使用方法
使用Dockerfile构建java web环境
Laravel安装步骤详细教程_Laravel环境搭建指南
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
网站制作壁纸教程视频,电脑壁纸网站?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
图册素材网站设计制作软件,图册的导出方式有几种?
5种Android数据存储方式汇总
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
网站制作价目表怎么做,珍爱网婚介费用多少?
高端建站三要素:定制模板、企业官网与响应式设计优化
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
Android利用动画实现背景逐渐变暗
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
javascript读取文本节点方法小结
C++用Dijkstra(迪杰斯特拉)算法求最短路径
详解jQuery停止动画——stop()方法的使用
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
如何快速生成可下载的建站源码工具?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
大连网站制作公司哪家好一点,大连买房网站哪个好?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何基于云服务器快速搭建个人网站?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南

