C++实践之路
基本信息
- 作者: Bartosz Milewski
- 译者: 周良忠
- 丛书名: C和C++实务精选
- 出版社:人民邮电出版社
- ISBN:7115105545
- 上架时间:2002-11-20
- 出版日期:2002 年11月
- 开本:16开
- 页码:421
- 版次:1-1
- 所属分类:
计算机 > 软件与程序设计 > C++
合作专区 > 微软技术图书 > 微软程序设计 > 微软C/C++/VC++
内容简介回到顶部↑
本书将带你领略C++作为工业编程语言的强大威力
全书分四个部分共23章。第一部分“语言”(第1章~第5章)从面向对象的角度讲解了C++的相关语言知识。第二部分“技术”(第6章~13章)介绍了许多实用的工业强度的编程技术,如清理、隐藏实现细节、资源管理、重载运算符等技术。第三部分“Windows”(第14章一第18章)探讨了编写和维护Windows应用程序的相关知识,是本书的特色部分。第四部分“知识扩展”(第19章一第23章)在以前所学知识的基础上进一步对软件设计策略、团队协作开发、平台移植等内容进行简单介绍。
附录A提供了第一部分内容中部分练习的答案。附录B介绍了事务处理相关知识。
本书适合于不同层次的C++程序员,无论是初学者还是高级程序员都可从中汲取有用的C++知识营养。
全书分四个部分共23章。第一部分“语言”(第1章~第5章)从面向对象的角度讲解了C++的相关语言知识。第二部分“技术”(第6章~13章)介绍了许多实用的工业强度的编程技术,如清理、隐藏实现细节、资源管理、重载运算符等技术。第三部分“Windows”(第14章一第18章)探讨了编写和维护Windows应用程序的相关知识,是本书的特色部分。第四部分“知识扩展”(第19章一第23章)在以前所学知识的基础上进一步对软件设计策略、团队协作开发、平台移植等内容进行简单介绍。
附录A提供了第一部分内容中部分练习的答案。附录B介绍了事务处理相关知识。
本书适合于不同层次的C++程序员,无论是初学者还是高级程序员都可从中汲取有用的C++知识营养。
作译者回到顶部↑
目录回到顶部↑
第一部分 语言
第1章 对象和作用域
1.1 全局作用域
1.2 本地作用域
1.3 嵌入对象
l.4 继承(inhentance)
l.5 成员函数和接日
1.6 成员函数作用域
1.7 类型
1.7.1 小结
1.7.2 练习
1.8 抽象数据类型
第2章 数组和弓佣
2.1 引用
2.2 运算符
2.2.1 算术
2.2.2 逻辑
2.2.3 位逻辑运算符
2.3 基于堆栈的计算器
2.3.1 外部规范
第1章 对象和作用域
1.1 全局作用域
1.2 本地作用域
1.3 嵌入对象
l.4 继承(inhentance)
l.5 成员函数和接日
1.6 成员函数作用域
1.7 类型
1.7.1 小结
1.7.2 练习
1.8 抽象数据类型
第2章 数组和弓佣
2.1 引用
2.2 运算符
2.2.1 算术
2.2.2 逻辑
2.2.3 位逻辑运算符
2.3 基于堆栈的计算器
2.3.1 外部规范
译者序回到顶部↑
软件项目的成功与否与开发语言的选择息息相关。而在确定某种语言为开发工具前,我们通常要提出这样的问题“这一语言能高效地实现我们的软件目的吗?最终产品是否易于维护?它与其他语言相比优势何在?”当今的很多商业软件首选C++作为他们的开发语言,就是因为C++对以上问题能提供令人相当满意的答案。简言之,C++是ANSI标准C语言的增强版本,但它对C语言的扩充是革命性的。C++不仅支持面向对象编程,而且它还可以方便地构建一个由相关对象组成的层次等级树,同时,它出色的可维护性和可扩展性使得它成为商业软件开发中最流行的语言之一。
要想成为一名优秀的C++程序员,仅仅具备C的相关知识背景是远远不够的,而且C的一些习惯思维方法并不利于充分利用C++的高效与先进性。因此,学习一些C++编程技巧是每个合格C++程序员的必修课。本书正是一本为我们提供大量实用C++编程技巧的书籍。
本书第一部分从面向对象的角度讲解了C++的许多语言要点,初学者可以对C++面向对象编程获得更清晰的认识。第二部分则讲解了大量实用技术,这些技术经过广大程序员的多年实践证明是开发可靠程序的必备技巧。例如资源管理技术是任何用C++开发的商业程序必须正确处理和应用的核心技术之一。本书的另一个可贵之处是对Windows应用程序开发的诸多技巧进行了一定深度的介绍。Windows应用程序的开发难度大,同时,相关资源也难以获取,所以,这部分知识对于专业程序员来说无疑具有宝贵的参考价值。最后,作为一名工业强度型程序员,他还必须具备软件设计、团队协作开发、平台移植等多方面的知识,本书也对这方面的知识进行了讨论。
为了方便读者的学习与实践,本书还附带一张光盘,你可以从光盘上找到本书所涉及的所有源代码及项目。
由于译者水平有限,错误在所难免,望广大读者不吝指正。译者的E-mail是webmaster@CloudCrown.com。
译者
2002年5月
要想成为一名优秀的C++程序员,仅仅具备C的相关知识背景是远远不够的,而且C的一些习惯思维方法并不利于充分利用C++的高效与先进性。因此,学习一些C++编程技巧是每个合格C++程序员的必修课。本书正是一本为我们提供大量实用C++编程技巧的书籍。
本书第一部分从面向对象的角度讲解了C++的许多语言要点,初学者可以对C++面向对象编程获得更清晰的认识。第二部分则讲解了大量实用技术,这些技术经过广大程序员的多年实践证明是开发可靠程序的必备技巧。例如资源管理技术是任何用C++开发的商业程序必须正确处理和应用的核心技术之一。本书的另一个可贵之处是对Windows应用程序开发的诸多技巧进行了一定深度的介绍。Windows应用程序的开发难度大,同时,相关资源也难以获取,所以,这部分知识对于专业程序员来说无疑具有宝贵的参考价值。最后,作为一名工业强度型程序员,他还必须具备软件设计、团队协作开发、平台移植等多方面的知识,本书也对这方面的知识进行了讨论。
为了方便读者的学习与实践,本书还附带一张光盘,你可以从光盘上找到本书所涉及的所有源代码及项目。
由于译者水平有限,错误在所难免,望广大读者不吝指正。译者的E-mail是webmaster@CloudCrown.com。
译者
2002年5月
前言回到顶部↑
我将本书分成4部分:语言、技术、Windows和知识扩展。下面简要描述每部分的目标和结构。
语言
本书的第一部分重点讲解作为通用目的编程的C++语言,然而这不是你常见的C++指导。
对于那些对C或C++知之甚少的初学者来说,本部分内容只是作为一种面向对象的语言介绍了C++(尽管C++的内涵远非如此)。本部分没有重点介绍语法或语法规则,它只是说明如何在C++中表达一定的思想,就像通过对话而不是背单词和语法规则来学习一门外语一样(当我给学生授课时,我称这部分内容为“对话式 C++”)。毕竟这是程序所需要的:能以特定语言编写程序的形式来表达自己的思想。当我学习一门外语时,我想知道的第一件事就是如何使用这样的问句“How much does it cost?”我不需要学习“cost”的过去时、现在时及将来时的所有动词时态,我只希望能在国外顺利地购物。
对于一个不太了解C++的C程序员来说(不等于说C++不活跃、很神秘,但C的其他一些于集往往有这种弊病),这是一个忘记 C、有效运用C++编程的练习机会。为什么要忘记C?C++不是C的一个超集吗?的确C++是C的一个超集,让C++与C兼容完全是一个符合实际市场决策,而且这样做取得了成功!它不是一个全新的产品,它不必花费十年的时间来单独开辟市场,它是“ 3.1版本”的C。这样做也是利弊相随的。“利”在于 C++及一些面向对象的编程元素与C向后兼容,这样可以迅速在编程领域占领一席之地“弊”在于它并不需要程序员更改编程习惯。
不必一次性重写所有的现有代码,许多公司可以逐步过渡到C++,现在很多公司仍然如此。通常的过渡方式就是将C++当成一种“更严格”的C来引入。从原则上讲,所有的C代码都可以作为C++代码重新编译。实际上,C++有着更严格的类型检查,而且编译器可以检测到更多的错误、发出更多的警告。所以,使用C++编译器重编译C代码是一个清理现有代码的好办法。在此阶段对源代码要做的修改主要是更正错误、实施更严格的类型。如果代码是用前ANSIC写成的,则会生成所有函数的原型。在这一ANSI化的过程中发现的错误之多让人感到吃惊。为了顺利过渡,以上所有工作都是值得的。只有在缺少优秀的C++编译器时(当然这种情况很少发生)人们才去使用C编译器。
一旦过渡到C++编译器环境中后,程序员迟早要学习一些新技巧,并最终开发一些C++编程方法(或通过自学、阅读一些辅助性书籍来达到目的)。但此时,许多程序员会受到一些不良的影响。因为C++的一些子集是许多原来C程序员应用过的(我将此子集称做为“C特区”)。许多C程序员看到这些“ C特区”后开始憎恨C++,但他们并没有意识到C++同样具有很多优秀之处。
在本书的前言中,我想澄清一件事。对于一个“C特区”程序员来说,本书对他们应该是一种冲击(我希望如此)。从本质上讲,“你到目前为止所做的一切都是错的”、“ Kemighan和 Ritchie并非神”(Brian Kernighan和Dennis Ritchie是C的创建者,也是著名的The C Programming Language一书的作者)。我知道,这类程序员的第一个自然反应就是合上本书立即要求退款。不要冲动!本书打破习俗的用意不在于伤害某个人的感情;而在于以一种不同的哲学思维来提醒读者重新思考他们的信条。
对于C++程序员来说,“语言”部分提供了一个审视C++的新角度。它演示了如何避免C++的缺陷以及如何根据先设计后具体实现的方式来应用这一语言。如果我说C++是一种优美的编程语言,这是不真实的。但它即将成为编写正规软件的最流行语言(至少在某些时候是)。我们最好充分利用它的丰富表达力来编写更出色的软件而不是用它不利的一面来伤害我们自己。对于一个C++程序员来说,这一部分内容不难读懂。而且,虽然这里介绍的结构和技术已广为人知,我还是尽量从不同的角度来展示它们。我的主导思想是创建一个易于维护、可读性强的系统。这就是为什么我抓住每一次机会不仅演示不同的编程选择,而且还解释为什么优先考虑某种方案的原因。
最后,对于一个Java程序员来说,他们可以利用本书来扩展知识。事实表明,根据一定的原则,利用C++可以编写出安全和可靠的代码。Java能做到的,C++也能做到,而且能做得更多。另外,C++能提供无可匹敌的操作性能。
然而操作性能不是投身C++的唯一原因。完善的资源管理在C++中能实现,但在Java中不可能实现,因为Java要依赖于垃圾口收机制。在C++中,你可以创建这样的对象:它的生存期由它所在的作用域准确定义。在退出这些作用域时,你要保证这些对象将被销毁。这就是为什么你可以让C++对象作为一个信号量来负责处理这些重要资源(如文件句柄、数据库事务处理等等)的原因。Java对象有一个未定义的生命期——只是在运行时决定回收它们时才释放这些资源。所以,说到Java中处理资源的方式就得重提旧式C的异常范例,在这种情况下,最后的子句必须要进行痛苦的显式垃圾回收。
没有“纯粹” C++出身的程序员。当我们“谈到” C++时,或多或少都会涉及其他一些编程背景。我们中间的一些人有着深厚的C背景,一些人使用类似Smalltalk的表达方式,还有一些人在使用LISP。“语言”部分的目标是尽可能让你成为一名正统的C++程序员。语言是表达思想的一种工具。所以,我的讲解重点不是语法而是程序员表达自己的方式。在这里不是介绍“ C++的结构是什么,你应该怎么用”,而更多的是以“我们有了一种思想,那么该怎样用C++来表达呢?”的方式来讲解。最初,这一“思想”可能以“星球是一种天体”或“一个难栈允许你用推入或弹出数据”的简单句子形式表达,以后再将这些句子组成“段落”和“章”来描述软件组件的功能。在需要解决相关问题的适当场合介绍不同的C++结构。
技术
开发优秀软件不仅仅需要了解语言本身。首先,程序不是在真空中执行,它必须与计算机交互作用。交互意味着通过操作系统来发挥作用。若对操作系统一无所知,就不可能编写出像样的程序。其次,我们不仅需要编写能运行的程序,我们还希望程序小巧、快速、可靠。强健以及具有扩展性。第三,我希望在合理的时间内完成程序的开发,并且能在以后维护和改进此程序。
本书第二部分“技术”的目标是让你从“业余编程”过渡到“工业强度型编程”。我描述了一些可以使程序更强健、维护性更强的C++编程技术。其中的“资源管理”重在介绍程序的创建、获取、拥有及释放各种资源。在程序执行的任一时刻,每一种资源都必须存在一个明确的拥有者负责释放它。这一简单的思想在设计和维护复杂的软件系统中相当有用。运用资源所有权关系分析法可以避免、发现和排除许多bug。
资源管理与C++异常处理能自然地吻合。事实上,如果不封装资源几乎不可能使用异常来编写合理的C++程序。那么,什么时候使用异常呢?它们能为我们做些什么呢?这取决于你对下面简单问题的回答:你总是检查new的结果吗(或者对于C程序员来说就是检查malloc的结果)?这是一个反问句。除非你是一个格外小心的程序员,你才不用这样!这意味着不管你希望与否,你都已经使用了异常,因为访问一个空指针就会导致一个叫做“一般性保护”(程序员也称做GP过错或访问违例)的异常。如果你的程序没有添加防异常措施,当它遇到这种异常时就会死机。甚至操作系统会弹出一个消息框,证实你的应用程序所使用的技术不合格。
我的观点是,为了编写强健可靠的应用程序,使用异常是最终的选择——这也是本书的目的。当然,还有其他一些可成功地应用于开发强健可靠应用程序的编程技术(这些技术现在仍然被我们使用)。不过,结合应用C++异常与资源管理带来的简单性和可维护性是这些技术所不及的。
Windows
就我所知,这是第一本深入探讨了使用现代C++进行Windows编程的书籍。事实是Windows API很混乱,现有的库也同样不是完全规范一致,使得Windows应用程序的编写不是那么简单,但这并不意味着这一主题就没有意义。在C++类、名宇空间及模板中封装Windows API是一种挑战,这需要对整个Windows范例的重新深层构思。
这部分内容的主要目标是探讨创建和维护Windows程序的简单途径——更侧重于维护。我常常问我自己这样的问题:“添加或修改一个消息句柄应该简单到什么程度?添加一个新菜单项、一条命令、一个对话框呢?而且如何才能将程序员犯错的可能性降到最低呢?”最后,还要考虑将库移植到例如像Linux的其他平台上(但这不是必需的)。
语言
本书的第一部分重点讲解作为通用目的编程的C++语言,然而这不是你常见的C++指导。
对于那些对C或C++知之甚少的初学者来说,本部分内容只是作为一种面向对象的语言介绍了C++(尽管C++的内涵远非如此)。本部分没有重点介绍语法或语法规则,它只是说明如何在C++中表达一定的思想,就像通过对话而不是背单词和语法规则来学习一门外语一样(当我给学生授课时,我称这部分内容为“对话式 C++”)。毕竟这是程序所需要的:能以特定语言编写程序的形式来表达自己的思想。当我学习一门外语时,我想知道的第一件事就是如何使用这样的问句“How much does it cost?”我不需要学习“cost”的过去时、现在时及将来时的所有动词时态,我只希望能在国外顺利地购物。
对于一个不太了解C++的C程序员来说(不等于说C++不活跃、很神秘,但C的其他一些于集往往有这种弊病),这是一个忘记 C、有效运用C++编程的练习机会。为什么要忘记C?C++不是C的一个超集吗?的确C++是C的一个超集,让C++与C兼容完全是一个符合实际市场决策,而且这样做取得了成功!它不是一个全新的产品,它不必花费十年的时间来单独开辟市场,它是“ 3.1版本”的C。这样做也是利弊相随的。“利”在于 C++及一些面向对象的编程元素与C向后兼容,这样可以迅速在编程领域占领一席之地“弊”在于它并不需要程序员更改编程习惯。
不必一次性重写所有的现有代码,许多公司可以逐步过渡到C++,现在很多公司仍然如此。通常的过渡方式就是将C++当成一种“更严格”的C来引入。从原则上讲,所有的C代码都可以作为C++代码重新编译。实际上,C++有着更严格的类型检查,而且编译器可以检测到更多的错误、发出更多的警告。所以,使用C++编译器重编译C代码是一个清理现有代码的好办法。在此阶段对源代码要做的修改主要是更正错误、实施更严格的类型。如果代码是用前ANSIC写成的,则会生成所有函数的原型。在这一ANSI化的过程中发现的错误之多让人感到吃惊。为了顺利过渡,以上所有工作都是值得的。只有在缺少优秀的C++编译器时(当然这种情况很少发生)人们才去使用C编译器。
一旦过渡到C++编译器环境中后,程序员迟早要学习一些新技巧,并最终开发一些C++编程方法(或通过自学、阅读一些辅助性书籍来达到目的)。但此时,许多程序员会受到一些不良的影响。因为C++的一些子集是许多原来C程序员应用过的(我将此子集称做为“C特区”)。许多C程序员看到这些“ C特区”后开始憎恨C++,但他们并没有意识到C++同样具有很多优秀之处。
在本书的前言中,我想澄清一件事。对于一个“C特区”程序员来说,本书对他们应该是一种冲击(我希望如此)。从本质上讲,“你到目前为止所做的一切都是错的”、“ Kemighan和 Ritchie并非神”(Brian Kernighan和Dennis Ritchie是C的创建者,也是著名的The C Programming Language一书的作者)。我知道,这类程序员的第一个自然反应就是合上本书立即要求退款。不要冲动!本书打破习俗的用意不在于伤害某个人的感情;而在于以一种不同的哲学思维来提醒读者重新思考他们的信条。
对于C++程序员来说,“语言”部分提供了一个审视C++的新角度。它演示了如何避免C++的缺陷以及如何根据先设计后具体实现的方式来应用这一语言。如果我说C++是一种优美的编程语言,这是不真实的。但它即将成为编写正规软件的最流行语言(至少在某些时候是)。我们最好充分利用它的丰富表达力来编写更出色的软件而不是用它不利的一面来伤害我们自己。对于一个C++程序员来说,这一部分内容不难读懂。而且,虽然这里介绍的结构和技术已广为人知,我还是尽量从不同的角度来展示它们。我的主导思想是创建一个易于维护、可读性强的系统。这就是为什么我抓住每一次机会不仅演示不同的编程选择,而且还解释为什么优先考虑某种方案的原因。
最后,对于一个Java程序员来说,他们可以利用本书来扩展知识。事实表明,根据一定的原则,利用C++可以编写出安全和可靠的代码。Java能做到的,C++也能做到,而且能做得更多。另外,C++能提供无可匹敌的操作性能。
然而操作性能不是投身C++的唯一原因。完善的资源管理在C++中能实现,但在Java中不可能实现,因为Java要依赖于垃圾口收机制。在C++中,你可以创建这样的对象:它的生存期由它所在的作用域准确定义。在退出这些作用域时,你要保证这些对象将被销毁。这就是为什么你可以让C++对象作为一个信号量来负责处理这些重要资源(如文件句柄、数据库事务处理等等)的原因。Java对象有一个未定义的生命期——只是在运行时决定回收它们时才释放这些资源。所以,说到Java中处理资源的方式就得重提旧式C的异常范例,在这种情况下,最后的子句必须要进行痛苦的显式垃圾回收。
没有“纯粹” C++出身的程序员。当我们“谈到” C++时,或多或少都会涉及其他一些编程背景。我们中间的一些人有着深厚的C背景,一些人使用类似Smalltalk的表达方式,还有一些人在使用LISP。“语言”部分的目标是尽可能让你成为一名正统的C++程序员。语言是表达思想的一种工具。所以,我的讲解重点不是语法而是程序员表达自己的方式。在这里不是介绍“ C++的结构是什么,你应该怎么用”,而更多的是以“我们有了一种思想,那么该怎样用C++来表达呢?”的方式来讲解。最初,这一“思想”可能以“星球是一种天体”或“一个难栈允许你用推入或弹出数据”的简单句子形式表达,以后再将这些句子组成“段落”和“章”来描述软件组件的功能。在需要解决相关问题的适当场合介绍不同的C++结构。
技术
开发优秀软件不仅仅需要了解语言本身。首先,程序不是在真空中执行,它必须与计算机交互作用。交互意味着通过操作系统来发挥作用。若对操作系统一无所知,就不可能编写出像样的程序。其次,我们不仅需要编写能运行的程序,我们还希望程序小巧、快速、可靠。强健以及具有扩展性。第三,我希望在合理的时间内完成程序的开发,并且能在以后维护和改进此程序。
本书第二部分“技术”的目标是让你从“业余编程”过渡到“工业强度型编程”。我描述了一些可以使程序更强健、维护性更强的C++编程技术。其中的“资源管理”重在介绍程序的创建、获取、拥有及释放各种资源。在程序执行的任一时刻,每一种资源都必须存在一个明确的拥有者负责释放它。这一简单的思想在设计和维护复杂的软件系统中相当有用。运用资源所有权关系分析法可以避免、发现和排除许多bug。
资源管理与C++异常处理能自然地吻合。事实上,如果不封装资源几乎不可能使用异常来编写合理的C++程序。那么,什么时候使用异常呢?它们能为我们做些什么呢?这取决于你对下面简单问题的回答:你总是检查new的结果吗(或者对于C程序员来说就是检查malloc的结果)?这是一个反问句。除非你是一个格外小心的程序员,你才不用这样!这意味着不管你希望与否,你都已经使用了异常,因为访问一个空指针就会导致一个叫做“一般性保护”(程序员也称做GP过错或访问违例)的异常。如果你的程序没有添加防异常措施,当它遇到这种异常时就会死机。甚至操作系统会弹出一个消息框,证实你的应用程序所使用的技术不合格。
我的观点是,为了编写强健可靠的应用程序,使用异常是最终的选择——这也是本书的目的。当然,还有其他一些可成功地应用于开发强健可靠应用程序的编程技术(这些技术现在仍然被我们使用)。不过,结合应用C++异常与资源管理带来的简单性和可维护性是这些技术所不及的。
Windows
就我所知,这是第一本深入探讨了使用现代C++进行Windows编程的书籍。事实是Windows API很混乱,现有的库也同样不是完全规范一致,使得Windows应用程序的编写不是那么简单,但这并不意味着这一主题就没有意义。在C++类、名宇空间及模板中封装Windows API是一种挑战,这需要对整个Windows范例的重新深层构思。
这部分内容的主要目标是探讨创建和维护Windows程序的简单途径——更侧重于维护。我常常问我自己这样的问题:“添加或修改一个消息句柄应该简单到什么程度?添加一个新菜单项、一条命令、一个对话框呢?而且如何才能将程序员犯错的可能性降到最低呢?”最后,还要考虑将库移植到例如像Linux的其他平台上(但这不是必需的)。
序言回到顶部↑
自从本书在美国出版后,我有丰收到了许多读者的反馈。读者在利用本书学习编程的同时,我也意识到了本书的优势与不足之处。下面将我的体会奉献给大家。
本书的第一部分“语言”对于大部分初学者来说似乎太难。如果你是一位入门级的程序员,开始阅读这部分内容时不要被吓倒。我在给大学生讲课时使用的就是这部分材料。我还使用本书来教授我的侄于,他只是一名高中生,但实际上,在书本内容之外,我还得进行额外的解释。有经验的教师可以使用该书作为C++初学者的基础课程,再辅之与相关解释和示例,完全可以达到理想的教学效果。
讲授C++的传统途径是从C的子集开始,现在人们普遍认为这种方式效率不高。我的教学方法是直接切入面向对象编程,并随后介绍过程化和泛型编程。这就是我为什么没有在开始章节中使用太多C++标准库的原因。
还有另一种教学法,即让学生直接跳到标准库并学习 C++,把这部分内容当成基础知识。按照这种教学法,学生第一天起就可以做一些有用的事,但他们必须首先无条件掌握许多知识点。他们必须学会使用模板、容器、迭代器等,而不一定理解它们的工作方式或如何适应于该语言。
最佳教学方式根据特定的读者而有所不同,也许应该是上述两种方法的折衷——从一开始就介绍一些标准库的主要知识,但重点放在面向对象编程上。如果让我现在重写本书,我大概会在入门章节中介绍标准字符串。字符申和输入/输出流是比较容易的抽象概念一一它们可以看作C++程序的主要构建块。
高级程序员在反馈中对第二部分内容(技术)给予了肯定。特别是,这里描述的“资源管理技术”让许多程序员恍然大悟。这些技术虽然简单,但应用的好坏对程序质量产生的影响却是天壤之别。我越来越相信,C++中的资源管理比其他语言中的垃圾回收更强大。
“Windows”一部分提到的反馈最有趣。我了解到,许多程序员对于Windows编程退避三舍,因为他们认为只能使用商业库才能开发出Windows应用程序。这类库的质量往往非常低劣,而且事实表明,质量的低下往往带来程序的复杂性。许多读者在本书中看到WindowsAPI可以封装到并不复杂的现代C++结构中,而且这种作法易于理解,使用安全;这使他们甚感欣慰。
最后谈谈本书的结尾几章。它们讲解了软件开发的复杂性,随着时间的延续,这种复杂性将得到进一步的证实。程序员的时间日益宝贵,找到更好的编程方法和工具甚至显得更为紧迫。
我很高兴看到本书能与中国程序员见面。我希望本书能为他们创建高质量、高可靠性软件出一份力。
在我的记忆中,中国程序员面临的独特挑战是让计算机能与中文,尤其是与中文字符无缝工作。我意识到,对于中国读者来说,本书缺少了这方面的知识。本书尚未涉及到宽位字符串和流、Unicode或本地化这方面的重要话题。要支持各种不同的语言、字符和习俗,这涉及到 C++(和Windows)的各个方面。对于这些主题,我只能希望中国读者在看过本书之后,额外地学习其他补充材料。
Bartosz Milewski
2002年9月
为什么写这本书
的确,现在详细讲解C++各方面知识的优秀书籍为数不少,为什么还要写这本C++书呢?对于学习这一语言及各种编程技巧来说,市场上提供的书籍已相当饱和了。但本书不是一本语言参考书或高明技巧和模式的集合,本书旨在讨论编程方面的知识。
讲授编程与教授一种语言大不相同。程序员通常要面对一个必须通过编写程序来解决的问题——而不是面对他需要讲解的语言功能。在本书中,我将尽可能演示如何使用C++这一语言作为一种解决编程问题的工具。
本书以几个软件项目为中心展开。在每个项目中,我首先描述即将解决的问题。然后,我讨论程序应该做什么、应该是什么样,以及如何对用户的输入做出反应。在此基础上,我构建一个没有实现具体功能的程序框架。最后,我将按组件逐个实现相关功能。
不过,程序也不会到此停止不前。接下来,本书还要进行一系列的代码审查并进行改写。“怎样才能精益求精?”,这是程序员经常自问的问题。再接着另一个需要解决的问题是“如何编写容易修改的代码?”
与现实生活一样,编程的途径也不是唯一的。这就是为什么讨论不同解决方案优缺点的极其重要的原因。不知道如何比较不同方案的程序员将举步维艰。当我讨论“因为人们总是这样做……”这样的问题时,我会说出自己遇到的挫折。在本书中,这样的讨论有很多。我努力探讨每种解决方案的优缺点,而且在多数情况下,我设法找到我认为理想的方案。不过,我绝不会以“理想”作为评判目标。我相信,每个人都可以在这些所谓“理想”的背后提出一些非常实际的意见。在多数情况下,一个理想的解决方案进行了非常优秀的抽象或通用化。这样生成的代码易于理解、修改和调试。
最后,在本书中,我强调了编程中人的因素。我的座右铭是“程序是为程序员而写的,不是为计算机而写的。”程序员希望编写更优秀的程序,不是为了让它更易于计算机理解,而是让程序更易于让人理解。不理解程序是不可能维护程序的。这一点看起来似乎明显,但许多程序员却忽视了这一不言而喻的真理。
为什么适合你阅读
本书的第一部分“语言”对于大部分初学者来说似乎太难。如果你是一位入门级的程序员,开始阅读这部分内容时不要被吓倒。我在给大学生讲课时使用的就是这部分材料。我还使用本书来教授我的侄于,他只是一名高中生,但实际上,在书本内容之外,我还得进行额外的解释。有经验的教师可以使用该书作为C++初学者的基础课程,再辅之与相关解释和示例,完全可以达到理想的教学效果。
讲授C++的传统途径是从C的子集开始,现在人们普遍认为这种方式效率不高。我的教学方法是直接切入面向对象编程,并随后介绍过程化和泛型编程。这就是我为什么没有在开始章节中使用太多C++标准库的原因。
还有另一种教学法,即让学生直接跳到标准库并学习 C++,把这部分内容当成基础知识。按照这种教学法,学生第一天起就可以做一些有用的事,但他们必须首先无条件掌握许多知识点。他们必须学会使用模板、容器、迭代器等,而不一定理解它们的工作方式或如何适应于该语言。
最佳教学方式根据特定的读者而有所不同,也许应该是上述两种方法的折衷——从一开始就介绍一些标准库的主要知识,但重点放在面向对象编程上。如果让我现在重写本书,我大概会在入门章节中介绍标准字符串。字符申和输入/输出流是比较容易的抽象概念一一它们可以看作C++程序的主要构建块。
高级程序员在反馈中对第二部分内容(技术)给予了肯定。特别是,这里描述的“资源管理技术”让许多程序员恍然大悟。这些技术虽然简单,但应用的好坏对程序质量产生的影响却是天壤之别。我越来越相信,C++中的资源管理比其他语言中的垃圾回收更强大。
“Windows”一部分提到的反馈最有趣。我了解到,许多程序员对于Windows编程退避三舍,因为他们认为只能使用商业库才能开发出Windows应用程序。这类库的质量往往非常低劣,而且事实表明,质量的低下往往带来程序的复杂性。许多读者在本书中看到WindowsAPI可以封装到并不复杂的现代C++结构中,而且这种作法易于理解,使用安全;这使他们甚感欣慰。
最后谈谈本书的结尾几章。它们讲解了软件开发的复杂性,随着时间的延续,这种复杂性将得到进一步的证实。程序员的时间日益宝贵,找到更好的编程方法和工具甚至显得更为紧迫。
我很高兴看到本书能与中国程序员见面。我希望本书能为他们创建高质量、高可靠性软件出一份力。
在我的记忆中,中国程序员面临的独特挑战是让计算机能与中文,尤其是与中文字符无缝工作。我意识到,对于中国读者来说,本书缺少了这方面的知识。本书尚未涉及到宽位字符串和流、Unicode或本地化这方面的重要话题。要支持各种不同的语言、字符和习俗,这涉及到 C++(和Windows)的各个方面。对于这些主题,我只能希望中国读者在看过本书之后,额外地学习其他补充材料。
Bartosz Milewski
2002年9月
为什么写这本书
的确,现在详细讲解C++各方面知识的优秀书籍为数不少,为什么还要写这本C++书呢?对于学习这一语言及各种编程技巧来说,市场上提供的书籍已相当饱和了。但本书不是一本语言参考书或高明技巧和模式的集合,本书旨在讨论编程方面的知识。
讲授编程与教授一种语言大不相同。程序员通常要面对一个必须通过编写程序来解决的问题——而不是面对他需要讲解的语言功能。在本书中,我将尽可能演示如何使用C++这一语言作为一种解决编程问题的工具。
本书以几个软件项目为中心展开。在每个项目中,我首先描述即将解决的问题。然后,我讨论程序应该做什么、应该是什么样,以及如何对用户的输入做出反应。在此基础上,我构建一个没有实现具体功能的程序框架。最后,我将按组件逐个实现相关功能。
不过,程序也不会到此停止不前。接下来,本书还要进行一系列的代码审查并进行改写。“怎样才能精益求精?”,这是程序员经常自问的问题。再接着另一个需要解决的问题是“如何编写容易修改的代码?”
与现实生活一样,编程的途径也不是唯一的。这就是为什么讨论不同解决方案优缺点的极其重要的原因。不知道如何比较不同方案的程序员将举步维艰。当我讨论“因为人们总是这样做……”这样的问题时,我会说出自己遇到的挫折。在本书中,这样的讨论有很多。我努力探讨每种解决方案的优缺点,而且在多数情况下,我设法找到我认为理想的方案。不过,我绝不会以“理想”作为评判目标。我相信,每个人都可以在这些所谓“理想”的背后提出一些非常实际的意见。在多数情况下,一个理想的解决方案进行了非常优秀的抽象或通用化。这样生成的代码易于理解、修改和调试。
最后,在本书中,我强调了编程中人的因素。我的座右铭是“程序是为程序员而写的,不是为计算机而写的。”程序员希望编写更优秀的程序,不是为了让它更易于计算机理解,而是让程序更易于让人理解。不理解程序是不可能维护程序的。这一点看起来似乎明显,但许多程序员却忽视了这一不言而喻的真理。
为什么适合你阅读
相关资源回到顶部↑
· 【推荐】众多高校学子口口相传,他们共同的选择--华清远见嵌入式学院(嵌入式Linux就业课程、3G手机开发就业课程,通过入学测试即签100%就业协议,4个月集中实训,世界500强企业成功就业保障!!!)· 【亚嵌教育 嵌入式培训专家】(嵌入式培训,嵌入式Linux培训,ARM培训,Linux培训,3G培训,Android培训,WINCE培训,DSP培训,FPGA培训,嵌入式就业培训)
· 程序员的7种武器(正则表达式、编程语言、数据库、算法、软件调试、开发环境)
· C/C++ 经典著作(《C专家编程》《C++ Templates中文版》《C和指针 》《C陷阱与缺陷》《C++沉思录》)








点击看大图






加载中...

