您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 第五版 中文版 练习 13.27 个人code

2014-10-06 11:13 411 查看
C++ Primer 第五版 中文版 练习 13.27

题目:定义你自己的使用引用计数版本的HasPtr。

答:

HasPtr.h

#pragma once

#include <string>

class HasPtr
{
public:
//构造分配新的string和新的计数器,将计数器置为1
HasPtr(const std::string &s = std::string()) :ps(new std::string(s)), i(0), use(new std::size_t(1)) {}
//拷贝构造函数拷贝所有三个数据成员,并递增计数器
HasPtr(const HasPtr &p) :ps(p.ps), i(p.i), use(p.use)
{
++*use;
}
//拷贝赋值运算符
HasPtr& operator=(const HasPtr&);
//析构函数
~HasPtr();
private:
std::string *ps;
int i;
std::size_t *use;  //共享计数器用来记录有多少个对象共享*ps的成员
};


HasPtr.cpp

#include "HasPtr.h"

HasPtr::~HasPtr()
{
if (--*use)			//如果引用计数器变为0
{
delete ps;		//释放string内存
delete use;		//释放计数器内存
}
}

HasPtr& HasPtr::operator=(const HasPtr &rhs)
{
++*rhs.use;			//递增右侧运算对象的引用计数
if (--*use == 0)	//递减本对象的引用计数
{
delete ps;		//没有其它用户则释放ps和use
delete use;
}
ps = rhs.ps;		//从rhs拷贝数据到本对象
i = rhs.i;
use = rhs.use;
return *this;		//返回本对象
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: