Thinking in C++: 第1章 为什么C++会成功(改进了C的缺点,可复用C的知识与库,执行效率相当)
本文内容摘抄自C++经典书籍:《Thinking in C++》
操作概念:OOP程序像什么
我们已经知道,用C 语言编写的过程程序就是一些数据定义和函数调用。要理解这种程序的含义,程序员必须掌握函数调用和函数实现的本身。这就是过程程序需要中间表示的原因。中间表示容易引起混淆,因为中间表示的表述是原始的,更偏向于计算机,而不偏向于所解决的问题。
因为 C++ 向 C 语言增加了许多新概念,所以程序员很自然地认为,C + +程序中的m a i n ( )会比功能相同的 C 程序更复杂。
但令人吃惊的是,一个写得很好的C + +程序一般要比功能相同的C程序更简单和容易理解。程序员只会看到一些描述问题空间对象的定义(而不是计算机的描述),发送给这些对象的消息。这些消息表示了在这个空间的活动。
面向对象程序设计的优点之一是通过阅读,很容易理解代码。通常,面向对象程序需要较少的代码,因为问题中的许多部分都可以用已存在的库代码。
为什么C++会成功
C + +能够如此成功,部分原因是它的目标不只是为了将 C语言转变成O O P语言(虽然这是最初的目的),而且还为了解决当今程序员,特别是那些在 C语言中已经大量投资的程序员所面临的许多问题。
人们已经对O O P语言有了这样传统的看法:程序员应当抛弃所知道的每件事情并且从一组新概念和新文法重新开始,他应当相信,最好丢掉所有来自过程语言的老行装。从长远角度看,这是对的。但从短期角度看,这些行装还是有价值的。最有价值的可能不是那些已存在的代码库(给出合适的工具,可以转变它),而是已存在的头脑库。
作为一个职业 C程序员,如果让他丢掉他知道的关于 C的每一件事,以适应新的语言,那么,几个月内,他将毫无成果,直到他的头脑适应了这一新范例为止。如果他能调整已有的 C知识,并在这个基础上扩展,那么他就可以继续保持高效率,带着已有的知识,进入面向对象程序设计的世界。因为每个人有他自己的程序设计模型,所以这个转变是很混乱的。因此, C + +成功的原因是经济上的:转变到O O P需要代价,而转变到C + +所花的代价较小。
C + +的目的是提高效率。效率取决于很多东西,而语言是为了尽可能地帮助使用者,尽可能不用武断的规则或特殊的性能妨碍使用者。 C + +成功是因为它立足于实际:尽可能地为程序员提供最大便利。
较好的C
即便程序员在C + +环境下继续写C代码,也能直接得到好处,因为C + +堵塞了C语言中的一些漏洞,并提供更好的类型检查和编译时的分析。程序员必须先说明函数,使编译器能检查它们的使用情况。预处理器虚拟删除值替换和宏,这就减少了查找疵点的困难。C + +有一个性能,称为r e f e r e n c e s (引用),它允许对函数参数和返回值的地址进行更方便的处理。函数重载改进了对名字的处理,使程序员能对不同的函数使用相同的名字。另外,名字空间也加强了名字的控
制。许多性能使C的更安全。
采用渐进的学习方式
与学习新语言有关的问题是效率的问题。所有公司都不可避免地因软件工程师学习新语言而突然降低了效率。C + +是对C的扩充,而不是新的文法和新的程序设计模型。程序员学习和理解这些性能,逐渐应用并继续创建有用的代码。这是 C + +成功的最重要的原因之一。
另外,已有的C代码在C + +中仍然是有用的,但因为 C + +编译器更严格,所以,重新编译这些代码时,常常会发现隐藏的错误。
运行效率
有时,以程序执行速度换取程序员的效率是值得的。假如一个金融模型仅在短期内有用,那么快速创建这个模型比所写程序能更快速执行重要。很多应用程序都要求有一定的运行效率,所以C + +在更高运行效率时总是犯错。 C程序员非常重视运行效率,这让他们认为这个语言不太庞大,也不太慢。产生的代码运行效率不够时,程序员可以用 C + +的一些性能做一些调整。
C + +不仅有与C相同的基本控制能力(和C + +程序中直接写汇编语言的能力),非正式的证据指出,面向对象的C + +程序的速度与用C写的程序速度相差在±1 0 %之内,而且常常更接近。用O O P方法设计的程序可能比C的对应版本更有效。
系统更容易表达和理解
为适合于某问题而设计的类当然能更好地表达这个问题。这意味着写代码时,程序员是在用问题空间的术语描述问题的解(例如“把锁链放在箱子里”),而不是用计算机的术语,也就是解空间的术语,描述问题的解(例如“设置芯片的一位即合上继电器”)。程序员所涉及的是较高层的概念,一行代码能做更多的事情。
易于表达所带来的另一个好处是易于维护。据报道,在程序的整个生命周期中,维护占了花费的很大部分。如果程序容易理解,那么它就更容易维护,还能减少创建和维护文档的花费。
“库”使你事半功倍
创建程序的最快方法是使用已经写好的代码:库。 C + +的主要目标是让程序员能更容易地使用库,这是通过将库转换为新数据类型(类)来完成的。引入一个库,就是向该语言增加一个新类型。编译器负责这个库如何使用,保证适当的初始化和清除,保证函数被正确地调用,因此程序员的精力可以集中在他想要这个库做什么,而不是如何做上。
因为程序的各部分之间名字是隔离的,所以程序员想用多少库就用多少库,不会有像 C语言那样的名字冲突。
• 模板的源代码重用
一些重要的类型要求修改源代码以便有效地重用。模板可以自动完成对代码的修改,因而是重用库代码特别有用的工具。用模板设计的类型很容易与其他类型一起工作。因为模板对程序员隐藏了这类代码重用的复杂性,所以特别好用。
错误处理
在C语言中,错误处理声名狼藉。程序员常常忽视它们,对它们束手无策。如果正在建大而复杂的程序,没有什么比让错误隐藏在某处,且不能指出它来自何处更糟的了。 C + +的异常处理(见第1 7章的内容)保证能检查到错误并进行处理。
大程序设计
许多传统语言对程序的规模和复杂性有自身的限制。例如, B A S I C对于某些类型的问题能很快解决,但是如果这个程序有几页纸长,或者超出该语言的正常解题范围,那么它可能永远算不出结果。C语言同样有这样的限制,例如当程序超过 50 000行时,名字冲突就开始成为问题。简言之,程序员用光了函数和变量名。另一个特别糟糕的问题是如果 C语言中存在一些小漏洞 — 错误藏在大程序中,要找出它们是极其困难的。
没有清楚的文字告诉程序员,什么时候他的语言会失效,即便有,他也会忽视它们。他不说“我的B A S I C程序太大,我必须用 C重写”,而是试图硬塞进另外几行,增加额外的性能。所以额外的花费就悄悄增加了。
设计C + +的目的是为了辅助大程序设计,也就是说,去掉小程序和大程序之间复杂性的分界。当程序员写h e l l o - w o r l d类实用程序时,他确实不需要用O O P、模板、名字空间和异常处理,但当他需要的时候,这些性能就有用了。而且,编译器在排除错误方面,对于小程序和大程序一样有效。
http://blog.csdn.net/rl529014/article/details/51921883
Thinking in C++: 第1章 为什么C++会成功(改进了C的缺点,可复用C的知识与库,执行效率相当)的更多相关文章
- 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles
老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles poptest是国内唯一一家培养测试开 ...
- Thinking in C++: 第1章 为什么C++会成功
本文内容摘抄自C++经典书籍:<Thinking in C++> 操作概念:OOP程序像什么 我们已经知道,用C 语言编写的过程程序就是一些数据定义和函数调用.要理解这种程序的含义,程 ...
- 第08章 MySQL聚合函数
第08章 MySQL聚合函数 我们上一章讲到了 SQL 单行函数.实际上 SQL 函数还有一类,叫做聚合(或聚集.分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值. 1 ...
- 最纯粹的直播技术实战02-Camera的处理以及推流
最纯粹的直播技术实战02-Camera的处理以及推流 最新实战教程.Android自己主动化刷量.作弊与防作弊.案例:刷友盟统计.批量注冊苹果帐号 这个系列的文章将会研究最纯粹的Android直播的实 ...
- 你必须了解的java内存管理机制(四)-垃圾回收
本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...
- Learning Spark 第四章——键值对处理
本章主要介绍Spark如何处理键值对.K-V RDDs通常用于聚集操作,使用相同的key聚集或者对不同的RDD进行聚集.部分情况下,需要将spark中的数据记录转换为键值对然后进行聚集处理.我们也会对 ...
- KnockoutJS 3.X API 第六章 组件(5) 高级应用组件加载器
无论何时使用组件绑定或自定义元素注入组件,Knockout都将使用一个或多个组件装载器获取该组件的模板和视图模型. 组件加载器的任务是异步提供任何给定组件名称的模板/视图模型对. 本节目录 默认组件加 ...
- Asp.Net MVC4 + Oracle + EasyUI 学习 第二章
Asp.Net MVC4 + Oracle + EasyUI 第二章 --使用Ajax提升网站性能 本文链接:http://www.cnblogs.com/likeli/p/4236723.html ...
- Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句
第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...
随机推荐
- MySQL库目录下db.opt文件的作用
细心的朋友可能会发现有时候在某些库目录下有个 db.opt 文件,那这个文件是干什么用的呢?如果你用vi等编辑器打开看的话,内容很简单,是用来记录该库的默认字符集编码和字符集排序规则用的.也就是说如果 ...
- NOI十连测 第四测 T1
思路:首先每个蚂蚁移速相同,而且碰到就转头,这其实等价于擦肩而过! 看到2n个数互不相同就觉得方便多了:枚举每个数字往左或者往右作为最慢,然后考虑其他蚂蚁有多少种走路方向. (1),走的距离大于m/2 ...
- [置顶] SPL讲解(6)--Condition篇
SmartPersistenceLayer 2.0 之 Condition篇 原理 强大的Condition功能是SPL的一个特性,可以使用Condition完成绝大部分的条件定义,使用 ...
- Unix/Linux环境C编程入门教程(38) shell命令进阶演示
1.w命令 该命令也可以查看登录当前系统的用户信息.与who命令相比,w命令的功能更强大,它不但可以显示当前有哪些用户登录到系统,还可以显示这些用户正在进行的操作,并给出更加详细和科学的统计数据 ...
- 64位Win7安装+32位Oracle + PL/SQL 解决方法
软件景象:64位win7.32位Oracle 10g. PL/SQL 9.0.4.1644 媒介:以前开辟用的都是32位体系,忽然换到64位上,安装景象真的有点麻烦了,尤其对于PL/SQL只支撑32位 ...
- 微信iOS WKWebview 网页开发适配指南
微信iOS客户端将于2017年3月1日前逐步升级为WKWebview内核,需要网页开发者提前做好网站的兼容检查和适配. 背景 WKWebView 是苹果在iOS 8中引入的新组件,目的是提供一个现代的 ...
- 本人对于JavaScript的一些总结
类型.值和变量 1.原始类型 数字.字符串和布尔 null空 undefined未定义 2.对象类型 3.类 Array Function Date RegExp Error 4.js ...
- Unity3d修炼之路:载入一个预制体,然后为该对象加入组件,然后查找对象,得到组件。
#pragma strict function Awake(){ //载入一个预制体 资源必须在 Resources目录下 Resources.LoadLoad(); //载入后 必须演示样例化 Ga ...
- hdu 4750 Count The Pairs (2013南京网络赛)
n个点m条无向边的图,对于q个询问,每次查询点对间最小瓶颈路 >=f 的点对有多少. 最小瓶颈路显然在kruskal求得的MST上.而输入保证所有边权唯一,也就是说f[i][j]肯定唯一了. 拿 ...
- 一个非常给力的播放器video-js
video-js采用的是html5播放器. 在不支持html5的浏览器会自动切换成flash. video-js的官网http://www.videojs.com/ 看看下载的demo就知道个大概了. ...