看了下《C++沉思录》第六章的内容介绍的是句柄第一部分,采用引用计数器的方式减少内存的拷贝

动手敲了下代码加深点印象,加了点注释

class Point
{
public:
    ///无参数的构造函数的作用:对于要创建一个Point的数组来说,
    ///我们可能只采用一个带缺省参数的构造函数
    Point():xval(0), yval(0){}
    Point(int x, int y): xval(x), yval(y){}

int x() const {return xval;}
    int y() const {return yval;}

Point& x(int xv)
    {
        xval = xv;
        return *this;
    }

Point& y(int yv)
    {
        yval = yv;
        return *this;
    }
private:
    int xval;
    int yval;
};

Point类代表的是坐标系上的1个点,Point类有2个成员变量xval和yval,有2个构造函数,有获取xval,yval这两个值得函数x(),y(),有设置xval,yval这两个值得函数x(),y()

-------------------句柄类------------------------------------------
class Handle
{
public:
    Handle();
    ~Handle();
    Handle(int x, int y);
    Handle(const Point &p0);

Handle(const Handle& h0);
    Handle& operator=(const Handle& h0);

int x() const;
    int y() const;
    Handle& x(int xval);
    Handle& y(int yval);
private:
    UPoint *up;
};

Handle::Handle():up(new UPoint()){}

Handle::~Handle()
{
    ///引用计数器没有减到0,不释放内存
    if (--up->u)
    {
        delete up;
        up = NULL;
    }
}

Handle::Handle(int x, int y):up(new UPoint(x, y)){}

Handle::Handle(const Point &p0):up(new UPoint(p0)){}

///拷贝构造函数,引用计数器++
Handle::Handle(const Handle& h):up(h.up)
{
    ++up->u;
}

///等号操作符,先递增右侧的引用计数器,再递减左侧引用计数器
///这一操作即使左右两个句柄引用同一个UPoint对象也能正常工作
Handle& Handle::operator=(const Handle& h)
{
    ++h.up->u;
    if (--up->u == 0)
    {
        delete up;
    }

up = h.up;

return *this;
}

int Handle::x() const
{
    return up->p.x();
}

int Handle::y() const
{
    return up->p.y();
}

Handle& Handle::x(int xval)
{
    up->p.x(xval);

return *this;
}

///指针语义
Handle& Handle::y(int yval)
{
    up->p.y(yval);

return *this;
}

///值语义
/*
Handle h(3, 4);
Handle h2 = h;
h2.x(5);
int n = h.x();      ///是3还是5
Handle& Handle::x(int xval)
{
    if (up->u != 1)
    {
        --up->u;
        up = new UPoint(up->p)
    }

up->p.x(xval);

return *this;
}
*/

handle应该控制它所绑定的对象,就是由handle创建和销毁对象,从效果上来讲handle就是一种只包含单个对象的容器,如果不想暴露Point的具体操作,就必须明确的选择让handle类支持那些Point操作

----------------UPoint---------------------------
///为什么需要UPoint这个类?该类用来容纳引用计数器和一个Point对象,
///这个类存粹是为了实现而设计的

class UPoint
{
    ///这里Hnandle需要访问UPoint类的成员变量,所以声明称UPoint的友元,位置不要搞反了
    friend class Handle;

UPoint():u(1){}
    UPoint(int x, int y):p(x, y), u(1){}
    UPoint(const Point& p0):p(p0), u(1){}

Point p;
    int u;
};

/*
 * 句柄类可以避免内存的重复拷贝
 */

int main()
{
    Point p(7, 8);
    Handle h(p);

Handle h2 = h;

cout << h2.x() << " " << h2.y() << endl;

cout << "**************TvT*****************" << endl;

return 0;
}

这个句柄类有一个缺点就是引用计数器和对象本身是存放在UPoint中的

C++沉思录-句柄类1相关推荐

  1. C++代理类,句柄(智能指针)_C++沉思录笔记

    代理类 首先定义三个类: class Animal{ public:virtual void getName()=0;virtual void clone()=0; };class Cat:publi ...

  2. c++ 沉思录笔记——句柄(第一部分)

    句柄:第一部分 前言 代理类可以让我们在一个容器中存储不同类型但相互关联的对象. 这种方法需要为每一个对象创建一个代理,并要将代理存储在容器中. 创建代理将会复制所代理的对象,就像复制代理一样. 怎么 ...

  3. 《C++沉思录 第2版》

    内容简介: <C和C++经典著作•C++沉思录:Ruminations on C++>基于作者在知名技术杂志发表的技术文章.世界各地发表的演讲以及斯坦福大学的课程讲义整理.写作而成,融聚了 ...

  4. 《C++沉思录》读书笔记

    <C++沉思录>读书笔记 序幕 动机 第1章 为什么我用C++ 第2章 为什么用C++工作 第3章 生活在现实世界中 类与继承 第4章 类设计者的核查表 第5章 代理类 第6章 句柄:第一 ...

  5. C++沉思录上提到的一道练习题及其源码实现

    题目大意(具体问题可参考C++沉思录第九章): 现实中,一张图片,可以给予添加一层又一层片框,也可以和其他的图片组合在一块,或横,或竖,--, 如下图所示: 普通的图片: wjj lqm lqmwjj ...

  6. ASP.NET Core 沉思录 - 结构化日志

    在 <ASP.NET Core 沉思录 - Logging 的两种介入方法>中我们介绍了 ASP.NET Core 中日志的基本设计结构.这一次我们来观察日志记录的格式,并进一步考虑如何在 ...

  7. 【ASP.NET Core 沉思录】CreateWebHostBuilder 是一个 Convension

    失踪人口回归.去年六月份开始,我开始翻译一千多页的<CSharp 7 in a Nutshell>到现在为止终于告一段落.我又回归了表世界.从这次开始我希望展开一个全新的主题.我叫它 AS ...

  8. 读书笔记∣概率论沉思录 01

    概率的解释基础分为两种,一是物理世界本身存在的随机性(客观概率),二是是我们由于信息不足而对事件发生可能性的度量(主观概率).基于此,形成了概率论的两大学派:频率论学派(传统数理统计学)和贝叶斯统计学 ...

  9. 《设计模式沉思录》—第2章2.4节访问权限

    本节书摘来自异步社区<设计模式沉思录>一书中的第2章,第2.4节访问权限,作者[美]John Vlissides,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

最新文章

  1. java jsp js xml_jsp实现将信息放入xml中的方法
  2. Matplotlib实例教程(十二)箱形图
  3. 传统方法怎么玩计算机审美
  4. 《算法》学习笔记2.1 初级排序算法
  5. 部署Lync For 移动设备 二
  6. ASP.NET Core Razor 页面使用教程
  7. 学习过程中的一些细节
  8. 笔记3:Tensorflow2.0实战之MNSIT数据集
  9. 力扣-80 删除有序数组中的重复项 II
  10. webstorm 配合IIS使用
  11. Oracle数据库通过创建触发器实现自增功能
  12. matlab 2017a安装教程
  13. android开发百度地图LocationClient找不到 解决
  14. Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation论文解析(视频超分)
  15. python画简单的图形(结构,循环)
  16. Excel表格中如何设置\插入斜线表头?
  17. 台式计算机开始不显示,台式机连接投影仪不显示怎么办
  18. Linux中超级用户root的密码破解与防止破解方法
  19. js中时间戳的各种用法
  20. 初学C语言的一点自我拙见

热门文章

  1. 使用 Flutter 之后,CPU占用率降了 50%
  2. mHook MinHook API Library Detour EasyHook
  3. error: GL/gl.h: No such file or directory
  4. FontForge不识别,WINDOWS报错:mstmc.ttf真的是字体文件吗?
  5. 基于WEB的学生综合测评管理系统
  6. 无法理解为什么要医护退回疫情补助
  7. 测绘程序设计——矩阵相加、相乘(C#)
  8. 将正方形图片变成圆形
  9. python识别花草_吴裕雄 python神经网络 花朵图片识别(10)
  10. sublime Text 些许使用配置