谈谈企业的数据工作!——企业的数据分析能力金字塔

写在前面
笔者写这篇文章的初衷源于两个故事:
故事一:一位在互联网行业做数据库架构多年的同事一起吃饭,问起我现在在说什么,我说自己在做医疗方面数据分析,同事笑,说:你有很多资源啊,只要你能拿到电子病例的数据,就能分析很多东西了……我脸上的微笑表情瞬间僵化!
故事二:当时为内蒙一个企业做上游原材料供应商的数据管理项目,当时我们拿到的只是该企业小部分供应商的数据,下一阶段计划拿到其全国供应商的相关数据给该企业进行管理支持。有一天,我们的项目负责人很兴奋,高兴地对我说:后面我们拿到所有供应商的数据后,我们做的就是“真正的大数据”了,你要考虑一下后面的大数据分析如何做啊……我脸上的微笑再一次僵化!
大家觉得以上两个故事如何?我当时内心是有一万头羊驼奔腾而过的~~
写这篇文章的目的很简单,就是希望向不了解数据分析体系建设的朋友们解释一下:数据分析到底都包括些什么?从完成数据采集到做出数据产品,到底有多远的路程要走?笔者在工作的过程中碰到过很多企业老板、客户以及领导,他们对数据分析的理解之浅薄,让我觉得难以置信。和他们交流之后的感触,促使我写了这篇文章。
1. 数据分析本身是一个过程
数据分析是企业的一种能力;数据分析本身是一个过程;数据分析的本质是一种思想。
数据分析是一个过程——企业利用这一过程将数据中的信息提取出来,进行处理、识别、加工、呈现,最后成为指导企业经营管理的知识和智慧。因而,企业利用这一过程的成熟程度,决定了企业使用数据的有效程度。
影响这一过程的因素有四个:(如果有不同意见,还请大家补充)
1、 技术和方法:我们的信息采集技术、数据库架构、数据处理技术、算法、可视化等都会在很大程度上对这一过程产生根本性的限制或改变,这就是为什么分布式存储、运算等技术成熟后,大数据这一概念被热捧的一个原因;
2、 数据的应用:更准确的说数据应用在一个企业、一个行业甚至全社会中被理解的程度有多深、使用范围有多广,决定了你的数据影响力能够达到的程度;
3、 商务模式:这是一个当数据能力在市场中体现时才会发挥作用的因素,好的商务模式可以为行业内、跨行业的数据应用、数据产品提供好的商业环境,帮助其成长;而坏的商务模式也可能毁掉一个好的数据产品;
4、 制度和规则:制度和规则既有国家层面的,例如数据安全保障方面的法规;也有行规、企业内部制度等。这些制度和规则保障了数据能够被人们用在需要且正确的地方,而不是被滥用(某种程度上,制度和规则的缺失也是造成数据安全问题、行业数据标准混乱的主要原因)。
在我看来,从拿到数据到将数据中的知识提炼成人类的智慧,这是一个很长的过程,有可能一年甚至几年(但是很多人把这个过程想得太短了)。
首先,想要分析数据你要获取数据。获取数据这个过程如果是线上还相对容易,如果是线下就非常复杂,这也是为什么现在实体行业推进“互联网+”如此缓慢的一个原因。
其次,得到数据之后,如何整理才能让数据变成信息,也是个“技术活”。这里涉及到数据的清洗、整理、关联等等问题,最麻烦的还不是做这些工作,而是随着我们对数据认识的加深,这些工作总是不定时地就要返工修缮一遍——这也是没有办法的事情!
再次,数据整理得到的信息是海量的,需要经过加工、提取、抽象等操作,提炼成为各项知识被人脑理解、吸收。这个过程就涉及到各种分析方法的使用,而且这也是个随着对业务认识的加深而逐渐复杂的过程,金融领域的风控模型、宏观经济领域的福利模型等等,都是发展多年并逐步演进的例子。
最后,人们在各个业务领域通过数据得到知识,在很多情况下可以重复应用在不同的领域,并与其他领域的知识相融合,形成新的生产生活方式。每个领域的知识内容如何相互融合,也是一个需要长期实践和探索的过程,“产品”这一概念从诞生到现在的发展过程,就是一个很好的例子。
我把上述过程做了一个简单的比喻帮助大家理解:
采集到的原始数据就像是一个一个的沙砾,在没有任何整合的情况下都是“一堆一堆的”;
数据处理的过程就是把沙堆中的杂质去掉,把每种颜色的沙砾区分开,再通过不同的工艺使其成为不同的砖块;
每个砖块在建造数据大厦的过程中都有不同的用处,我们会按照图纸(就是数据分析体系)将不同的砖块用在适当的建筑位置上;
数据大厦构建完成后,每个房间里面要完成的工作都各不相同,到底如何运用,就要看大厦使用者的安排了~~
那么,我们就来看看企业到底要做些什么,才能完成从数据采集到智慧积累的这一过程。
2. 企业的数据能力层级
个人认为,企业的数据分析能力层级大概可以分为七级(这里列出七个能力层级是强调底层基础数据采集的意思):基础IT系统的搭建、数据集中与标准化处理、数据报表及可视化的实现、日常产品和运营分析、精细化运营管理的实现、数据产品的输出和变现、数据战略的形成。
个人水平有限,最后的数据战略从没接触过,所以这里不做阐述。
可能有同行会对这个金字塔的层级不认同,而且大部分专家也认为这几个部分是平级关系,不存在高低关系……我这里这样列出来只是为了说明“要做到每个层级的水平,该层级以下的内容都是支撑这些层级的必要条件”而已,实际中的确是存在诸如“数据产品已经完成上线,但是数据可视化还停留在需要人工完成报表的阶段”这样的情况。(在互联网行业中,往往数据产品是最先出现的,而后才产生数据采集及后续内容,因为有了产品之后才会有业务流程;但是在实体行业中,线下业务流程是已有的,不需要等数据产品产生后才有业务流程,所以二者的数据分析构建过程完全不同。我这里对互联网产品领域不做考虑。)
下面我们就来详细说说每个层级的具体内容。
2.1. 基础IT系统
最底层的”基础IT系统”是一切数据分析的基础,因为它最重要的作用就是完成“数据采集”。
“基础IT系统”,这里主要指的就是我们各个企业在实际生产中使用的软件系统及其配套的硬件设备,如:网络世界中的一串串抓取代码,真实世界中的诸如医院里的医学影像设备和其他传感器、探测器,财务使用的财务管理软件等等,这些系统解决了我们口中的“数据采集”问题,正是因为有了这些基础的IT系统(包括软件和硬件),我们才能将生活中的所有一切数字化、可度量~~

解决了最基本的“数据采集”问题之后,是不是意味这我们就有数据了呢?NO!从数据采集系统中拿到的信息有这样几个特点:割裂的、碎片化的、无序的,它们必须经过处理之后才能用于使用,因而我们需要进入到下一个阶段“数据集中与标准化”。
2.2. 数据集中与标准化
在“数据集中与标准化”这一层级中,我们要实现的是数据的集中管理与相互融合,打破数据壁垒,让数据能够正常地在企业内流动。如果把数据比作企业运营的血液,那么我们要做的就是打通所有的血管,让血液自由地流动。
因而,这一阶段的工作并不只是“数据集中”和“数据标准化”两件事情,需要做的内容大概包括:(如有缺少的部分还请大家补充)
1、 数据清理:
这个步骤解决的问题是将系统采集到的内容转化为人类能够理解的数据内容,主要有两个方面:一是清理原始数据,使之完整、干净无杂质;二是将采集到的一些编码信息转化为人能看懂的文字、数字等数据。
2、 数据逻辑和数据结构的搭建:
每个系统中的数据描述的都只是企业业务流程中的一部分,因此梳理业务流程,按照业务流程找到各个系统之间数据的衔接点,从而实现多领域数据的关联。
第一步,根据业务逻辑,需要将数据分别划分为多少类?每一类的字段、纬度、统计周期等都是什么样的?每一类数据需要多少层汇总?……这些问题首先将数据从采集的清单分离出来,成为一个个数据体系;
第二步,在考虑数据关联逻辑方面,需要考虑三个方面:
1) 关联使用的“主键”需要在各个系统中实现统一,即在各个相关的系统中,对于同一内容的同一主键是相同的,例如:在电信系统中,用户ID是个在所有相关系统中可以唯一标识用户的主键,而非手机号码;
2) 各个系统中数据的时间颗粒度统一才能保证主键关联的有效使用,例如表格A是每日最新数据,表格B是每日数据,则使用时就要在时间上进行限制:表格A中的日期=表格B中最大日期,而且这种情况下,要想查询A表中的历史数据就无法查到;
3) 各类数据在业务上存在相互制约、相互影响的关系,这种关系也要在多系统的数据关联中体现出来,例如营销活动中的活动商品数量受到库存商品数量的限制,在营销活动执行过程中,每增加一单活动商品销售量,库存商品数就要进行相应的减少,若不做相应的触发变更,多系统数据融合也会意义大减。
这里我要特别强调一下数据关联的意义。在行业内,我们经常把每一个包含了大量数据、却又与其他系统无任何连通的数据系统称之为“数据孤岛”。在多数实体行业中,一个企业内部也不同程度地存在数据孤岛问题。有些数据孤岛本身因为包含的数据内容较多,足以支撑一定的数据分析应用的建设;但是有些数据孤岛中的数据若想发挥价值,就必须实现与其他系统数据的有效融合使用,即数据关联。
2.3. 数据报表与可视化
解决了数据关联和标准化的问题之后,我们下一步要解决的问题是:如何能让大家看到数据?
最简单直接的方法是“数据报表”。对,就是按照日常业务使用习惯,构建各种表格,在表格中填写大量的数据。有的企业是手工制作报表,有的企业使用IT工具制作报表,有的企业则进入到了数据可视化的阶段,什么方式实现的不重要,重要的是将数据报表做出来呈现给用户进行使用。
数据可视化是随着数据图形化展现技术发展起来的,它的功能不仅仅是展示数据,它还将很多数据分析的方法、维度、样式与基础数据相结合,以更加形象和贴近业务应用场景的方式向用户展示数据要表达的内容或问题。
要实现数据可视化,不是只有可视化工具就可以了,这背后也要求使用者对需要数据展示的业务逻辑、图形效果等内容有深入的理解。
从“基础IT系统”到“数据报表及可视化”,前三个层级从某些方面而言,都是完成数据分析和数据应用工作的基础。对于一个企业来说,完成这三个层级的方式可以是手工形式的,也可以是本地系统化的,更可以是云端化的,但是无论如何只有在一定程度上具备了上述三个层级的能力,才能说企业具有了使用数据指导运营、决策、管理等进行数据应用的基础。
2.4. 产品与运营分析
在我的理解中,所有的分析都是从日常的产品和运营分析开始的。这一层级的主要作用有三个:
1、解决日常运营和监控需求;
2、深入分析用户、市场、产品;
3、以分析结果指导产品和运营工作。
下面我们分别解释:
产品和运营分析,首先要满足的就是日常数据的监控:高了?低了?为什么高?为什么低?数据的变动能否说明我们的产品和运营在往好的方向变化?如果变化是好的,我们如何继续保持?如果是不好的,那是什么原因造成的?如何改正?——这些是日常数据监控过程中,业务人员最常问的一些问题,解决这些问题是日常分析报告最主要的工作。
其次,当日常分析已经成为例行工作的一部分之后,企业的产品和业务人员就会发现简单的日常分析无法解释很多复杂的现象和问题,这就需要对用户、产品、渠道、市场、需求等等方面进行深入的分析和研究。在这个过程中,很多针对具体业务情况的分析专题和数据模型应运而生,这些专题和模型帮助企业更好地认识我们的市场,扑捉客户和潜在的商机。这其中最具代表性的例子就是“用户画像”(有关用户画像的内容网络上有很多文章,这里不再细说)。
最后,根据日常分析和各种深入分析的结论,我们能知道诸如:这个营业厅发展的用户质量很差,需要核实这些用户行为的真实性;在XX环节中,耗费的人工工时较长,需要看看是改进该环节的人员配置还是存在其他问题……如此种种从数据中反映的问题,最后都会归结为各种管理、运营、营销等方面的问题。如何应用数据结论去解决问题,则需要依靠业务人员的经验了。
2.5. 精细化运营
在“产品和运营分析”层级中积累的分析思路和分析方法,大多是分散的、点状的。在“精细化运营”这一层级,所有的分析不再相互孤立,而是更多地以一个实际业务场景为基础,在该业务场景下从“如何感知识别”,到“如何筛选用户”,再到“如何营销配合”,从而实现该场景下全部过程的统筹管理。
在这个过程中,数据分析不再只是分析报告、数据图表,它成为人们构建这个流程的一种贯穿始终的思想,流程中的每个环节都会有数据分析甚至数据挖掘的内容存在,以数据的结果驱动产品、渠道、投入资源等等内容的配合,共同构成该业务场景下的完整业务流程。当然,这一流程不能是靠手工来完成,一定是自动化的,人只是这一流程中起决策作用的节点而已。
更有甚者,将多个业务场景下的数据驱动过程进行组合,就形成了诸如“用户生命周期管理”、“会员运营体系”这样的数据应用集合(我这里暂且把它们成为数据应用集合,其实这些内容每个都可以形成一个单独的数据应用产品)。
如果企业中每个领域都能建设起来多个数据应用集合,那么这些集合就基本能够支撑其企业的主要运行管理工作。
2.6. 数据产品
数据产品在我看来不是企业数据能力建设最终要实现的目标,它只是企业将内部数据价值变现的众多方式中的一种。
实体行业的数据产品很多时候是因为企业内部的数据能力成长到一定阶段,企业某些内部数据及分析方法已经具备了独立变现的条件,因而被企业单独拿出来作为一类产品提供到市场,从而形成我们所理解的数据产品。当然实体行业中出现的数据产品实例并不多(此观点仅是我的理解,如有异议欢迎大家沟通讨论)。
按照我的理解,企业内部某一数据应用足够成熟的时候,便具备了与其纵向上下游产业链之间及横向市场中其他企业数据相互融合使用的可能。这种纵向、横向的合作可以有很多形式,诸如:以具体数据内容为形式的数据交易,以体系化的分析方法为形式的分析工具,以产业内数据共享为形式的数据联盟等等,甚至当企业数据逐渐得到行业和市场的认可后,跨行业的数据产品交易和数据合作也是可以预见的。
个人认为,无论哪种产品形式,都必然离不开适当的商务模式,而必要的商务模式也是保证数据市场安全、高效运转的必备条件。
写在最后
笔者接触的很多实体行业中的企业,有些可能刚刚完成数据采集和数据中心的建设工作,有些则连数据采集问题都没有解决,层次各有不同。但是在接触这些公司的企业负责人时,每个人都雄心勃勃地说自己的企业要在未来的一两年内做出数据产品,完成数据价值的变现~~而当问到:您知不知道从贵公司现在的数据情况做到数据产品,需要走过多少阶段从而支撑您做成数据产品吗?对方的回答也出奇地相似:所以我们需要找一个懂这方面的人来啊……!
这就是我写这篇文章的初衷~~

本文摘自ITEYE平台:http://504479728.iteye.com/blog/2373649
【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林瑛 【丛书名】 图灵计算机科学丛书 【出版社】 人民邮电出版社 【书号】 7-115-14554-7 【开本】 16开 【页码】 900 【出版日期】 2006-3-1 【版次】 4-1 【内容简介】 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。本版对前一版进行了彻底的修订,内容经过了重新组织,更加入了C++ 先驱Barbara E. Moo在C++教学方面的真知灼见。既显著改善了可读性,又充分体现了C++语言的最新进展和当前的业界最佳实践。书中不但新增大量教学辅助内容,用于强调重要的知识点,提醒常见的错误,推荐优秀的编程实践,给出使用提示,还包含大量来自实战的示例和习题。对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。本书的前言阐述了 第4版和前一版的不同之处。 【目录信息】 第1章 快速入门 1 1.1 编写简单的C++程序 2 1.2 初窥输入/输出 5 1.2.1 标准输入与输出对象 5 1.2.2 一个使用IO库的程序 5 1.3 关于注释 8 1.4 控制结构 10 1.4.1 while语句 10 1.4.2 for语句 12 1.4.3 if语句 14 1.4.4 读入未知数目的输入 15 1.5 类的简介 17 1.5.1 Sales_item类 17 1.5.2 初窥成员函数 19 1.6 C++程序 21 小结 22 术语 22 第一部分 基本语言 第2章 变量和基本类型 29 2.1 基本内置类型 30 2.1.1 整型 30 2.1.2 浮点型 32 2.2 字面值常量 34 2.3 变量 38 2.3.1 什么是变量 39 2.3.2 变量名 40 2.3.3 定义对象 42 2.3.4 变量初始化规则 44 2.3.5 声明和定义 45 2.3.6 名字的作用域 46 2.3.7 在变量使用处定义变量 48 2.4 const限定符 49 2.5 引用 50 2.6 typedef名字 53 2.7 枚举 53 2.8 类类型 54 2.9 编写自己的头文件 57 2.9.1 设计自己的头文件 58 2.9.2 预处理器的简单介绍 60 小结 62 术语 62 第3章 标准库类型 67 3.1 命名空间的using声明 68 3.2 标准库string类型 70 3.2.1 string对象的定义和初始化 70 3.2.2 String对象的读写 71 3.2.3 string对象的操作 72 3.2.4 string对象中字符的处理 76 3.3 标准库vector类型 78 3.3.1 vector对象的定义和初始化 79 3.3.2 vector对象的操作 81 3.4 迭代器简介 83 3.5 标准库bitset类型 88 3.5.1 bitset对象的定义和初始化 88 3.5.2 bitset对象上的操作 90 小结 92 术语 92 第4章 数组和指针 95 4.1 数组 96 4.1.1 数组的定义和初始化 96 4.1.2 数组操作 99 4.2 指针的引入 100 4.2.1 什么是指针 100 4.2.2 指针的定义和初始化 101 4.2.3 指针操作 104 4.2.4 使用指针访问数组元素 106 4.2.5 指针和const限定符 110 4.3 C风格字符串 113 4.3.1 创建动态数组 117 4.3.2 新旧代码的兼容 120 4.4 多维数组 122 小结 124 术语 125 第5章 表达式 127 5.1 算术操作符 129 5.2 关系操作符和逻辑操作符 131 5.3 位操作符 134 5.3.1 bitset对象或整型值的使用 135 5.3.2 将移位操作符用于IO 137 5.4 赋值操作符 137 5.4.1 赋值操作的右结合性 138 5.4.2 赋值操作具有低优先级 138 5.4.3 复合赋值操作符 139 5.5 自增和自减操作符 140 5.6 箭头操作符 142 5.7 条件操作符 143 5.8 sizeof操作符 144 5.9 逗号操作符 145 5.10 复合表达式的求值 145 5.10.1 优先级 145 5.10.2 结合性 146 5.10.3 求值顺序 148 5.11 new和delete表达式 150 5.12 类型转换 154 5.12.1 何时发生隐式类型转换 154 5.12.2 算术转换 155 5.12.3 其他隐式转换 156 5.12.4 显式转换 158 5.12.5 何时需要强制类型转换 158 5.12.6 命名的强制类型转换 158 5.12.7 旧式强制类型转换 160 小结 161 术语 162 第6章 语句 165 6.1 简单语句 166 6.2 声明语句 167 6.3 复合语句(块) 167 6.4 语句作用域 168 6.5 if语句 169 6.6 switch语句 172 6.6.1 使用switch 173 6.6.2 switch中的控制流 173 6.6.3 default标号 175 6.6.4 switch表达式与case标号 176 6.6.5 switch内部的变量定义 176 6.7 while语句 177 6.8 for循环语句 179 6.8.1 省略for语句头的某些部分 180 6.8.2 for语句头中的多个定义 181 6.9 do while语句 182 6.10 break语句 183 6.11 continue语句 184 6.12 goto语句 185 6.13 try块和异常处理 186 6.13.1 throw表达式 186 6.13.2 try块 187 6.13.3 标准异常 189 6.14 使用预处理器进行调试 190 小结 192 术语 192 第7章 函数 195 7.1 函数的定义 196 7.1.1 函数返回类型 197 7.1.2 函数形参表 198 7.2 参数传递 199 7.2.1 非引用形参 199 7.2.2 引用形参 201 7.2.3 vector和其他容器类型的形参 206 7.2.4 数组形参 206 7.2.5 传递给函数的数组的处理 209 7.2.6 main:处理命令行选项 210 7.2.7 含有可变形参的函数 211 7.3 return语句 211 7.3.1 没有返回值的函数 212 7.3.2 具有返回值的函数 212 7.3.3 递归 216 7.4 函数声明 217 7.5 局部对象 220 7.5.1 自动对象 220 7.5.2 静态局部对象 220 7.6 内联函数 221 7.7 类的成员函数 222 7.7.1 定义成员函数的函数体 223 7.7.2 在类外定义成员函数 225 7.7.3 编写Sales_item类的构造 函数 225 7.7.4 类代码文件的组织 227 7.8 重载函数 228 7.8.1 重载与作用域 230 7.8.2 函数匹配与实参转换 231 7.8.3 重载确定的三个步骤 232 7.8.4 实参类型转换 234 7.9 指向函数的指针 237 小结 239 术语 240 第8章 标准IO库 243 8.1 面向对象的标准库 244 8.2 条件状态 247 8.3 输出缓冲区的管理 249 8.4 文件的输入和输出 251 8.4.1 文件流对象的使用 251 8.4.2 文件模式 254 8.4.3 一个打开并检查输入文件的 程序 256 8.5 字符串流 257 小结 259 术语 259 第二部分 容器和算法 第9章 顺序容器 263 9.1 顺序容器的定义 264 9.1.1 容器元素的初始化 265 9.1.2 容器内元素的类型约束 267 9.2 迭代器和迭代器范围 268 9.2.1 迭代器范围 270 9.2.2 使迭代器失效的容器操作 271 9.3 顺序容器的操作 272 9.3.1 容器定义的类型别名 272 9.3.2 begin和end成员 273 9.3.3 在顺序容器中添加元素 273 9.3.4 关系操作符 277 9.3.5 容器大小的操作 278 9.3.6 访问元素 279 9.3.7 删除元素 280 9.3.8 赋值与swap 282 9.4 vector容器的自增长 284 9.5 容器的选用 287 9.6 再谈string类型 289 9.6.1 构造string对象的其他方法 290 9.6.2 修改string对象的其他方法 292 9.6.3 只适用于string类型的操作 293 9.6.4 string类型的查找操作 295 9.6.5 string对象的比较 298 9.7 容器适配器 300 9.7.1 栈适配器 301 9.7.2 队列和优先级队列 302 小结 303 术语 303 第10章 关联容器 305 10.1 引言:pair类型 306 10.2 关联容器 308 10.3 map类型 309 10.3.1 map对象的定义 309 10.3.2 map定义的类型 310 10.3.3 给map添加元素 311 10.3.4 使用下标访问map对象 311 10.3.5 map::insert的使用 313 10.3.6 查找并读取map中的元素 315 10.3.7 从map对象中删除元素 316 10.3.8 map对象的迭代遍历 316 10.3.9 “单词转换”map对象 317 10.4 set类型 319 10.4.1 set容器的定义和使用 319 10.4.2 创建“单词排除”集 321 10.5 multimap和multiset类型 322 10.5.1 元素的添加和删除 322 10.5.2 在multimap和multiset 中查找元素 323 10.6 容器的综合应用:文本查询程序 325 10.6.1 查询程序的设计 326 10.6.2 TextQuery类 327 10.6.3 TextQuery类的使用 328 10.6.4 编写成员函数 330 小结 332 术语 332 第11章 泛型算法 335 11.1 概述 336 11.2 初窥算法 339 11.2.1 只读算法 339 11.2.2 写容器元素的算法 341 11.2.3 对容器元素重新排序的算法 343 11.3 再谈迭代器 347 11.3.1 插入迭代器 348 11.3.2 iostream迭代器 349 11.3.3 反向迭代器 353 11.3.4 const迭代器 355 11.3.5 五种迭代器 356 11.4 泛型算法的结构 358 11.4.1 算法的形参模式 359 11.4.2 算法的命名规范 359 11.5 容器特有的算法 361 小结 362 术语 363 第三部分 类和数据抽象 第12章 类 367 12.1 类的定义和声明 368 12.1.1 类定义:扼要重述 368 12.1.2 数据抽象和封装 369 12.1.3 关于类定义的更多内容 372 12.1.4 类声明与类定义 374 12.1.5 类对象 375 12.2 隐含的this指针 376 12.3 类作用域 380 类作用域中的名字查找 382 12.4 构造函数 385 12.4.1 构造函数初始化式 387 12.4.2 默认实参与构造函数 391 12.4.3 默认构造函数 392 12.4.4 隐式类类型转换 393 12.4.5 类成员的显式初始化 396 12.5 友元 396 12.6 static类成员 398 12.6.1 static成员函数 400 12.6.2 static数据成员 400 小结 403 术语 403 第13章 复制控制 405 13.1 复制构造函数 406 13.1.1 合成的复制构造函数 409 13.1.2 定义自己的复制构造函数 409 13.1.3 禁止复制 410 13.2 赋值操作符 411 13.3 析构函数 412 13.4 消息处理示例 415 13.5 管理指针成员 419 13.5.1 定义智能指针类 421 13.5.2 定义值型类 425 小结 427 术语 427 第14章 重载操作符与转换 429 14.1 重载操作符的定义 430 14.2 输入和输出操作符 435 14.2.1 输出操作符<>的重载 437 14.3 算术操作符和关系操作符 439 14.3.1 相等操作符 440 14.3.2 关系操作符 441 14.4 赋值操作符 441 14.5 下标操作符 442 14.6 成员访问操作符 443 14.7 自增操作符和自减操作符 446 14.8 调用操作符和函数对象 449 14.8.1 将函数对象用于标准库算法 450 14.8.2 标准库定义的函数对象 451 14.8.3 函数对象的函数适配器 453 14.9 转换与类类型 454 14.9.1 转换为什么有用 454 14.9.2 转换操作符 455 14.9.3 实参匹配和转换 458 14.9.4 重载确定和类的实参 461 14.9.5 重载、转换和操作符 464 小结 466 术语 467 第四部分 面向对象编程与泛型编程 第15章 面向对象编程 471 15.1 面向对象编程:概述 472 15.2 定义基类和派生类 473 15.2.1 定义基类 474 15.2.2 protected成员 475 15.2.3 派生类 476 15.2.4 virtual与其他成员函数 479 15.2.5 公用、私有和受保护的继承 482 15.2.6 友元关系与继承 486 15.2.7 继承与静态成员 486 15.3 转换与继承 487 15.3.1 派生类到基类的转换 487 15.3.2 基类到派生类的转换 489 15.4 构造函数和复制控制 490 15.4.1 基类构造函数和复制控制 490 15.4.2 派生类构造函数 490 15.4.3 复制控制和继承 494 15.4.4 虚析构函数 495 15.4.5 构造函数和析构函数中的虚函数 497 15.5 继承情况下的类作用域 497 15.5.1 名字查找在编译时发生 498 15.5.2 名字冲突与继承 498 15.5.3 作用域与成员函数 499 15.5.4 虚函数与作用域 500 15.6 纯虚函数 502 15.7 容器与继承 503 15.8 句柄类与继承 504 15.8.1 指针型句柄 505 15.8.2 复制未知类型 507 15.8.3 句柄的使用 508 15.9 再谈文本查询示例 511 15.9.1 面向对象的解决方案 513 15.9.2 值型句柄 514 15.9.3 Query_base类 515 15.9.4 Query句柄类 516 15.9.5 派生类 518 15.9.6 eval函数 520 小结 522 术语 523 第16章 模板与泛型编程 525 16.1 模板定义 526 16.1.1 定义函数模板 526 16.1.2 定义类模板 528 16.1.3 模板形参 529 16.1.4 模板类型形参 531 16.1.5 非类型模板形参 533 16.1.6 编写泛型程序 534 16.2 实例化 535 16.2.1 模板实参推断 537 16.2.2 函数模板的显式实参 540 16.3 模板编译模型 542 16.4 类模板成员 545 16.4.1 类模板成员函数 548 16.4.2 非类型形参的模板实参 551 16.4.3 类模板中的友元声明 552 16.4.4 Queue和QueueItem的友元 声明 554 16.4.5 成员模板 556 16.4.6 完整的Queue类 558 16.4.7 类模板的static成员 559 16.5 一个泛型句柄类 560 16.5.1 定义句柄类 561 16.5.2 使用句柄 562 16.6 模板特化 564 16.6.1 函数模板的特化 565 16.6.2 类模板的特化 567 16.6.3 特化成员而不特化类 569 16.6.4 类模板的部分特化 570 16.7 重载与函数模板 570 小结 573 术语 574 第五部分 高级主题 第17章 用于大型程序的工具 579 17.1 异常处理 580 17.1.1 抛出类类型的异常 581 17.1.2 栈展开 582 17.1.3 捕获异常 583 17.1.4 重新抛出 585 17.1.5 捕获所有异常的处理代码 586 17.1.6 函数测试块与构造函数 586 17.1.7 异常类层次 587 17.1.8 自动资源释放 589 17.1.9 auto_ptr类 591 17.1.10 异常说明 595 17.1.11 函数指针的异常说明 598 17.2 命名空间 599 17.2.1 命名空间的定义 599 17.2.2 嵌套命名空间 603 17.2.3 未命名的命名空间 604 17.2.4 命名空间成员的使用 606 17.2.5 类、命名空间和作用域 609 17.2.6 重载与命名空间 612 17.2.7 命名空间与模板 614 17.3 多重继承与虚继承 614 17.3.1 多重继承 615 17.3.2 转换与多个基类 617 17.3.3 多重继承派生类的复制控制 619 17.3.4 多重继承下的类作用域 620 17.3.5 虚继承 622 17.3.6 虚基类的声明 624 17.3.7 特殊的初始化语义 625 小结 628 术语 628 第18章 特殊工具与技术 631 18.1 优化内存分配 632 18.1.1 C++中的内存分配 632 18.1.2 allocator类 633 18.1.3 operator new函数和 operator delete函数 636 18.1.4 定位new表达式 638 18.1.5 显式析构函数的调用 639 18.1.6 类特定的new和delete 639 18.1.7 一个内存分配器基类 641 18.2 运行时类型识别 646 18.2.1 dynamic_cast操作符 647 18.2.2 typeid操作符 649 18.2.3 RTTI的使用 650 18.2.4 type_info类 652 18.3 类成员的指针 653 18.3.1 声明成员指针 653 18.3.2 使用类成员的指针 655 18.4 嵌套类 658 18.4.1 嵌套类的实现 658 18.4.2 嵌套类作用域中的名字查找 661 18.5 联合:节省空间的类 662 18.6 局部类 665 18.7 固有的不可移植的特征 666 18.7.1 位域 666 18.7.2 volatile限定符 668 18.7.3 链接指示:extern "C" 669 小结 672 术语 673 附录 标准库 675 索引 703
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值