句柄,也称为智能指针。

  我计算了一下我的时间,以后每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. 《我是一只IT小小鸟》读后感

    过了半个学期的大学生活,说实话,我是迷茫的,因为我还没有足够的了解IT这门课程,也不知道怎么学好这门课程. 直到老师推荐我们读一本书<我是一只it小小鸟>,起初,我并不认为它是一本多么好的 ...

  2. Httpclient请求数据

    package com.baidu.myutils; import java.io.IOException; import org.apache.http.HttpEntity; import org ...

  3. 重置了下系统好多关于mysql密码的文章都很渣拷分好的备用

    方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass ...

  4. xcode6 使用pch出错解决办法

    1down vote If you decide to add a .pch file manually and you want to use Objective-C just like befor ...

  5. web 乱码摘抄

    JavaWeb--中文乱码小结 JavaWeb--中文乱码小结 0.纯粹html乱码: 换个editor吧(有时候notepad都比sublime_text好用),最好是在<head>&l ...

  6. linux-yum

    yum - Yellowdog Updater Modified 简介: Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中 ...

  7. 排序系列 之 简单选择排序及其改进算法 —— Java实现

    简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 ...

  8. HTML5在VS2010中的智能提示

    按照baidu首页的方法是行不通的,于是尝试下面的方法 原文来自这里,我翻译以下   下载这个文件 this archive 并解压. 复制 html_5.xsd to D:\Program File ...

  9. js字符拼接

    for (var j = 0; j < 9; j++) { eval("if (datas[i].b" + j + " == '1') { b[j-1] = 1; ...

  10. Android Studio安装插件GsonFormat

    Android Studio菜单栏File > Settings > plugins' 这个是Android Studio搜索和安装插件的界面,下面直接上动图 : 安装结束后需要关闭重新启 ...