【C++】引用计数器简单示例

//引用计数器
// 封装一个计数器的类来维护,可以隐藏起来,即用户不必关心是如何实现的
#include <iostream>
using namespace std;
class String_Rep
{
	friend class String;
public:
	String_Rep(const char *str = " ") :count(0)
	{
		m_data = new char[strlen(str) + 1];
		strcpy(m_data, str);
	}
	~String_Rep()
	{
		delete[]m_data;
	}
public:
	void increment()
	{
		count++;
	}
	void decrement()
	{
		if (--count == 0)
		{
			delete this;// 哪一个rep的count为0了释放当时的rep
		}
	}
private:
	char *m_data;
	int count;
};
//////////////////////////////////////////////////////////////////////

class String
{
public:
	String(const char *str = " ") :rep(new String_Rep(str))
	{
		rep->increment();
	}
	String(const String &s) :rep(s.rep)
	{
		rep->increment();
	}
	String& operator=(const String &s)
	{
		if (this != &s)
		{
			rep->decrement();    // 迭代器
			rep = s.rep;
			rep->increment();
		}
		return *this;
	}
	~String()
	{
		rep->decrement();
	}
public:
	void print()const
	{
		cout << rep->m_data << endl;
	}
private:
	String_Rep *rep;// 句柄
};

int main()
{
	String s1("hello");
	String s2;
	s2 = s1;
	String s3("world");
	String s4;
	s4 = s3;
	s1.print();
	s2.print();
	s3.print();
	s4.print();
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 18:27:44

【C++】引用计数器简单示例的相关文章

c#webservice的简单示例

webservice.就概念上来说,可能比较复杂,不过我们可以有个宏观的了解:webservice就是个对外的接口,里面有 函数可供外部客户调用(注意:里面同样有客户不可调用的函数).假若我们是服务端,我们写好了个webservice,然后把它给了客户(同时我们给了他们调用规则),客户就可以在从服务端获取信息时处于一个相对透明的状态.即使客户不了解(也不需要)其过程,他们只获取数据. webservice传递的数据只能是序列化的数据,典型的就是xml数据. 下面以一个简单例子为例: (一)新建—

【C语言】【面试题】C++中String类引用计数器的浅拷贝写法与深拷贝写法

Linux操作下String类的实现--引用计数器 1.引用计数器写法一 写法一个人比较喜欢叫他双指针法,因为他是在类里面创建了两个指针来实现的一个是指针_str,另外一个是用来保存指向同一块空间个数的指针_pRefCount. class String { public:     String(char* str = "")         :_str(new char[strlen(str) + 1])         , _pRefCount(new int(1))     {

Android通过startService播放背景音乐简单示例

关于startService的基本使用概述及其生命周期可参见博客<Android中startService的使用及Service生命周期>. 本文通过播放背景音乐的简单示例,演示startService的基本使用流程. 系统界面如下: 界面上面就两个按钮,"播放音乐并退出Activity" 和 "停止播放音乐".我们在该示例中,通过操纵Activity的按钮控制MusicService播放或停止播放音乐. 我将一个名为music.mp3的放到资源目录/r

c# 单链表实现 简单示例(可复制直接运行)

最近学习数据结构,发现c# 其实和c 的链表的实现差不多的 下面是一段可直接运行的代码 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Threading; 5 6 namespace SingleLinkedList 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 13 //实例调用

NET Remoting 最简单示例

NET Remoting 最简单示例 2014-01-21 15:29 10492人阅读 评论(4) 收藏 举报  分类: .NET(6)  版权声明:本文为博主原创文章,未经博主允许不得转载. 学习技术知识一个好的方法是先动手,再深入, 给出一个最简单的Remoting程序示例(C#)如下: Step1:创建类库(DLL)工程RemotingObjects,类Person代码如下: [csharp] view plain copy using System; using System.Coll

php变量的引用计数器和写时复制

众所周知,PHP是不支持指针的,但是如果希望两个变量同时指向同一内存块怎么办呢?为了解决这个问题,PHP内核里使用了引用计数器. 上篇博文介绍了PHP变量在内核中的存储方式了,zval结构中下面两个成员变量用于引用计数器: is_ref BOOL值,标识变量是否是引用集合. refcount 计算指向引用集合的变量个数. 看下面的php代码 <?php $a = "this is a"; ?> 一个zval结构的实体称为zval容器.在php语言层创建一个变量就会相应地在p

PHP 引用计数器 通俗版解释

概述 最近看PHP中的引用计数器部分,首先被各种绕晕,然后通过看博客和分析后,总结了一个比较通俗的解释,能帮助自己很好地记忆,也希望能帮助到各位读者.这里分享一遍博文,是比较正统的解释:PHP变量之引用(http://hilojack.sinaapp.com/?p=1392). 建议 研究PHP引用计数器的变化可以通过安装Xdebug扩展来学习,安装后直接调用 xdebug_debug_zval('var') 来看变量 $var的引用计数器情况. 基础知识 谈引用计数器需要对PHP中变量的存储.

MD5加密算法简单示例

MD5加密算法简单示例 现在网络上一般的网站,只要功能稍微完善一点的,都需要用户进行注册,提供诸如用户名.用户密码.电子邮件.甚至是电话号码.详细住址等个人隐私信息,然后才可以享受网站提供的一些特殊的信息或者服务.为了增加安全性,有必要对数据库中的隐私数据进行加密. MD5算法,即"Message-Digest Algorithm 5(信息-摘要算法)",它是由MD2.MD3.MD4 发展而来的一种单向加密算法,也就是哈希(HASH)算法,是由国际著名的公钥加密算法标准RSA的第一设计

HTML-003-模拟IDE代码展开收起功能简单示例

当先我们在日常的编程开发工作中使用编程工具(例如 Eclipse.Sublime 等等)都有相应的代码折叠展开功能,如下图所示,极大的方便了我们的编码工作. 同时,我们在日常的网页,尤其的广大的博客网站的源码展示部分,都采用了此种显示方式,如下图所示(示例引用位置:008-Selenium 操作下拉列表实例-Select): 这么做的意义何在呢?我觉得其实际应用有如下两种: 内容的展示和隐藏:将用户最关心.感兴趣的内容展示给用户,若用户想继续深入了解,则可通过点击展示或隐藏按钮达到查看.隐藏内容