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; //返回本对象
}