C++沉思录-句柄类1
看了下《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相关推荐
- C++代理类,句柄(智能指针)_C++沉思录笔记
代理类 首先定义三个类: class Animal{ public:virtual void getName()=0;virtual void clone()=0; };class Cat:publi ...
- c++ 沉思录笔记——句柄(第一部分)
句柄:第一部分 前言 代理类可以让我们在一个容器中存储不同类型但相互关联的对象. 这种方法需要为每一个对象创建一个代理,并要将代理存储在容器中. 创建代理将会复制所代理的对象,就像复制代理一样. 怎么 ...
- 《C++沉思录 第2版》
内容简介: <C和C++经典著作•C++沉思录:Ruminations on C++>基于作者在知名技术杂志发表的技术文章.世界各地发表的演讲以及斯坦福大学的课程讲义整理.写作而成,融聚了 ...
- 《C++沉思录》读书笔记
<C++沉思录>读书笔记 序幕 动机 第1章 为什么我用C++ 第2章 为什么用C++工作 第3章 生活在现实世界中 类与继承 第4章 类设计者的核查表 第5章 代理类 第6章 句柄:第一 ...
- C++沉思录上提到的一道练习题及其源码实现
题目大意(具体问题可参考C++沉思录第九章): 现实中,一张图片,可以给予添加一层又一层片框,也可以和其他的图片组合在一块,或横,或竖,--, 如下图所示: 普通的图片: wjj lqm lqmwjj ...
- ASP.NET Core 沉思录 - 结构化日志
在 <ASP.NET Core 沉思录 - Logging 的两种介入方法>中我们介绍了 ASP.NET Core 中日志的基本设计结构.这一次我们来观察日志记录的格式,并进一步考虑如何在 ...
- 【ASP.NET Core 沉思录】CreateWebHostBuilder 是一个 Convension
失踪人口回归.去年六月份开始,我开始翻译一千多页的<CSharp 7 in a Nutshell>到现在为止终于告一段落.我又回归了表世界.从这次开始我希望展开一个全新的主题.我叫它 AS ...
- 读书笔记∣概率论沉思录 01
概率的解释基础分为两种,一是物理世界本身存在的随机性(客观概率),二是是我们由于信息不足而对事件发生可能性的度量(主观概率).基于此,形成了概率论的两大学派:频率论学派(传统数理统计学)和贝叶斯统计学 ...
- 《设计模式沉思录》—第2章2.4节访问权限
本节书摘来自异步社区<设计模式沉思录>一书中的第2章,第2.4节访问权限,作者[美]John Vlissides,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...
最新文章
- java jsp js xml_jsp实现将信息放入xml中的方法
- Matplotlib实例教程(十二)箱形图
- 传统方法怎么玩计算机审美
- 《算法》学习笔记2.1 初级排序算法
- 部署Lync For 移动设备 二
- ASP.NET Core Razor 页面使用教程
- 学习过程中的一些细节
- 笔记3:Tensorflow2.0实战之MNSIT数据集
- 力扣-80 删除有序数组中的重复项 II
- webstorm 配合IIS使用
- Oracle数据库通过创建触发器实现自增功能
- matlab 2017a安装教程
- android开发百度地图LocationClient找不到 解决
- Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation论文解析(视频超分)
- python画简单的图形(结构,循环)
- Excel表格中如何设置\插入斜线表头?
- 台式计算机开始不显示,台式机连接投影仪不显示怎么办
- Linux中超级用户root的密码破解与防止破解方法
- js中时间戳的各种用法
- 初学C语言的一点自我拙见
热门文章
- 使用 Flutter 之后,CPU占用率降了 50%
- mHook MinHook API Library Detour EasyHook
- error: GL/gl.h: No such file or directory
- FontForge不识别,WINDOWS报错:mstmc.ttf真的是字体文件吗?
- 基于WEB的学生综合测评管理系统
- 无法理解为什么要医护退回疫情补助
- 测绘程序设计——矩阵相加、相乘(C#)
- 将正方形图片变成圆形
- python识别花草_吴裕雄 python神经网络 花朵图片识别(10)
- sublime Text 些许使用配置