句柄,也称为智能指针。

  我计算了一下我的时间,以后每14天得读完一本书,才不愧对我买的这么多书。然而我还要抽出时间来谢谢博文。最近读的是c++沉思录,开篇就用了3章来讲述句柄。好了,废话少说,接下来谈谈我学到的内容。

  首先,我们知道c语言有指针,高手因为指针而灵活,菜鸟因为指针而危险。c++选择c作为底层语言,并兼容它,必然有指针,我想运用指针的灵活,却不想遇到指针的危险。那我到底用不用指针呢?

  于是,有前人设计了代理类---能指向目标类对象的类,这个代理类只含有一个数据成员--一个指向目标类对象的指针,代理类里定义了一系列的其他操作(函数成员)把这个指针变得不危险。这样一来,就形成了最初步的句柄。

  后来发现,代理类的操作里需要大量的复制操作。所以做了进一步优化,就成了一种句柄类,它能指向目标类对象,含有一个指针,和代理类一样,功能就是当指针用,但没有指针那么危险。它与代理类不同的地方就是,当多个句柄指向(绑定)同一个对象时,它们共享这个目标对象的内存,而代理类是绑定时需要复制。句柄类可以同时绑定统一个对象的内存而不复制,直到某一个句柄要修改它所指向的对象时才复制和修改。这样一来,就减少了很多没有必要的复制操作。带来的技术问题就是需要在目标对象里多加一个数据成员---计数器,用来记录当前指向它的句柄数量,而在最后一个句柄取消与它的绑定时收回这个对象所占用的内存。看,多么智能,这就是它为什么叫智能指针的原因,设计好类和它相应的句柄以后,开发者用起来就得心应手,指针的危险被句柄的设计者解决了,指针的灵活被类的使用者所拥有。

  可是,上面说的这种句柄还有一个缺点,就是它需要在目标对象里增加一个数据成员---计数器,它影响到了目标类,其实目标类只想有句柄用,并不想为此影响到自己的结构,所以有了现在最常用的句柄,把那个计数器从目标类里拿出来,放在任意一个地方,然后在句柄类里增加一个指针成员指向这个计数器,这时候的句柄拥有两个数据成员(一个指向目标对象的指针,一个指向计数器的指针),以后指向同一个目标对象的句柄就都指向同一个计数器,其他细节和上一种句柄类相同。这样一来,句柄就成为了真正的智能指针,指针拥有的危险全部用句柄成员函数把它屏蔽掉,这一部分的设计就看句柄的设计者,他可以把想像出来的优化全部加之进去。

  其实句柄还有很多种类,想法不一样,设计的细节就不一样,功能上也可能会有一些微妙的变化,一切都取决于设计者,但如果你是句柄的设计者,你最好还是把句柄的功能设计的让人用起来感觉和指针一样。如果你把它的功能设计的很怪异,那用这个句柄的人肯定会用不习惯,甚至还会偷偷吐槽设计者。

  c++设计出来的代码,就是优美,只要你住够了解它,它可以描述出你所有能抽象出来的所有东西。

c++句柄设计的更多相关文章

  1. Windows核心编程 第三章 内核对象

    第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...

  2. Nodejs事件引擎libuv源码剖析之:句柄(handle)结构的设计剖析

    声明:本文为原创博文,转载请注明出处. 句柄(handle)代表一种对持有资源的索引,句柄的叫法在window上较多,在unix/linux等系统上大多称之为描述符,为了抽象不同平台的差异,libuv ...

  3. C++ 句柄类的原理以及设计

    句柄类存在的意义是为了弥补将派生类对象赋给基类对象时发生的切片效应.比如以下的程序: multimap<Base> basket; Base base; Derived derive; b ...

  4. JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)

    1.事件冒泡与事件捕获 2.事件与事件句柄   3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处:     1.每个函 ...

  5. [转]Android Binder设计与实现 - 设计篇

    摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...

  6. 以ZeroMQ谈消息中间件的设计【译文】

    本文主要是探究学习比较流行的一款消息层是如何设计与实现的 ØMQ是一种消息传递系统,或者乐意的话可以称它为"面向消息的中间件".它在金融服务,游戏开发,嵌入式系统,学术研究和航空航 ...

  7. SOA 实现:服务设计原则

    http://www.ibm.com/developerworks/cn/webservices/ws-soa-design/ 引言 面向服务的体系结构(Service-Oriented Archit ...

  8. Windows多线程多任务设计初步(转)

    Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程 ...

  9. 解密jQuery事件核心 - 绑定设计(一)

    说起jQuery的事件,不得不提一下Dean Edwards大神 addEvent库,很多流行的类库的基本思想从他那儿借来的 jQuery的事件处理机制吸取了JavaScript专家Dean Edwa ...

随机推荐

  1. 2014年7月份第1周51Aspx源码发布详情

      QF万能视频播放器源码  2014-6-30 [VS2010]本源码是一个万能视频播放器源码.可实现各种格式的影片播放功能. 1.点击[开始]按钮,弹出窗口,选择影片路径,确定后即可播放.可拖拽滚 ...

  2. 《C++primer》v5 第8章 IO库 读书笔记 习题答案

    8.1.8.2 这一章不咋会啊.. istream &read(istream &is) { int a; auto old_state=is.rdstate(); is.clear( ...

  3. android SDK 离线下载更新

    http://blog.csdn.net/harvic880925/article/details/37913801 前言:在公司配置eclipse做android开发,真是烦死了,不知公司做了哪门子 ...

  4. html5 请求的URL转成 OC可用属性字符串显示

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:helpUrlStr]]; NSString *string = [ ...

  5. PIC XC8 EEPROM操作

    要做一个报警功能的东东,要求可以通过遥控来改变遥控内容.由于对系统的稳定性要求很高,所以用了看门狗. 可是看门狗复位会引起所有寄存器重置,恢复到默认状态.遥控要改变的内容也被复位了,所以只能借助EEP ...

  6. jQuery.pager无刷新分页

    刚刚学习前端的时候,需要一个无刷新的分页功能,找了一个不错的,大家也有很大分享,在这里写一个自己的部分代码,前后端都有,需要的小伙伴可以参考一下,代码不是完整的. 直接上伪代码<样式代码省略,部 ...

  7. div CSS样式——两张图片的位置关系

    以上是实现将logo图片按照相对位置覆盖在另一张图片上的代码. 通过学习,我学到了以下方法: 将第二张图片定位到第一张图片上. 下面是简单的实现:(假设图都是100*100的) <style&g ...

  8. [转]透过 Linux 内核看无锁编程

    非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...

  9. iOS的UIDevice,NSBundle,NSLocale

    iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用 户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取 ...

  10. foreach为什么要实现IEnumerable接口而不是直接用IEnumerator接口

    在.Net中,要想被foreach遍历,那么目标对象要实现IEnumerable或IEnumerable<T>接口,这个接口有一个方法,GetEnumerator(),返回一个IEnume ...