C++程序设计陷阱
基本信息
- 原书名:Avoiding common Problems in coding and design
- 原出版社: Addison-Wesley
编辑推荐
本书讨论了那些可能出现在所有C++代码中的基本错误,同样也详述了那些出现在C++语法、预处理、内存管理、多态性、类设计和类继承关系设计中可能出现的各种复杂错误。每一个错误和其所导致的错误结果将会结合错误发生的上下文仔细讲解,相应的解决为法也会详细地结合实例给出……
内容简介回到顶部↑
本书讨论了那些可能出现在所有C++代码中的基本错误,同样也详述了那些出现在C++语法、预处理、内存管理、多态性、类设计和类继承关系设计中可以出现的各种复杂错误。每一个错误和其所导致的错误结果将会结合错误发生的上下文仔细讲解,相应的解决办法也会详细地结合实例给出。
作者Stephen C.Dewhurst提供给读者各种C++习惯用法和设计模式,用于产生解决共性问题的定制方法。读者还将学会更多的通常被误解了的高级编程和设计中用到的C++特性。总之,本书向读者展示了如何在充满各种危险的C++世界中自由航行,以及如何学会C++专家所必备的各种实践知识。
Stephen C.Dewhurst曾经是贝尔实验室中第一批C++使用者的一员,他具有将近20年的C++应用经验,曾经用C++解决了诸多领域中的问题,如编译器设计、证券安全交易、电子商务以及嵌入式通讯等领域。他还是Programming in C++的作者之一,是C/C++ User Journal杂志的编辑,C++ Report杂志的专栏作家。同时,他还是两个C++编译器的开发者,以及大量C++编程文章的作者。
作者Stephen C.Dewhurst提供给读者各种C++习惯用法和设计模式,用于产生解决共性问题的定制方法。读者还将学会更多的通常被误解了的高级编程和设计中用到的C++特性。总之,本书向读者展示了如何在充满各种危险的C++世界中自由航行,以及如何学会C++专家所必备的各种实践知识。
Stephen C.Dewhurst曾经是贝尔实验室中第一批C++使用者的一员,他具有将近20年的C++应用经验,曾经用C++解决了诸多领域中的问题,如编译器设计、证券安全交易、电子商务以及嵌入式通讯等领域。他还是Programming in C++的作者之一,是C/C++ User Journal杂志的编辑,C++ Report杂志的专栏作家。同时,他还是两个C++编译器的开发者,以及大量C++编程文章的作者。
目录回到顶部↑
第一章 基本问题
陷阱1:注释泛滥
陷阱2:魔数
陷阱3:全局变量
陷阱4:没有区分重载和默认初始化
陷阱5:误解引用
陷阱6:误解const
陷阱7:忽略基本语言细节
陷阱8:无法区分访问和可见性
陷阱9:使用糟糕的语言
陷阱10:忽略习惯用语
陷阱11:不必要的小聪明
陷阱12:青春期行为
第2章 语法
陷阱13:混淆数组/初始值
陷阱14:求值顺序不确定
陷阱15:优先级问题
陷阱1:注释泛滥
陷阱2:魔数
陷阱3:全局变量
陷阱4:没有区分重载和默认初始化
陷阱5:误解引用
陷阱6:误解const
陷阱7:忽略基本语言细节
陷阱8:无法区分访问和可见性
陷阱9:使用糟糕的语言
陷阱10:忽略习惯用语
陷阱11:不必要的小聪明
陷阱12:青春期行为
第2章 语法
陷阱13:混淆数组/初始值
陷阱14:求值顺序不确定
陷阱15:优先级问题
译者序回到顶部↑
编程新手与高手之间到底有什么区别呢?如何尽快从“菜鸟”快速变成“大虾”?许多程序员都有过这样的经历,学习一种语言的基本语法和编程环境并不是很难,因为只要你懂得了一门语言,在学习其他语言时,许多编程语句的使用基本上都是相同的,有异曲同工之处。但在实际编程的过程中,你总会遇到一些莫名其妙的问题,有时百思不得其解,但一个编程高手可能看一眼,就知道问题的根源在哪里。想成为这样的高手吗?
在实现同样的功能时,为什么有的程序员编写的程序读起来非常舒服,有的却让你头晕脑胀?为什么有的程序可以一再使用,而大幅提高工作效率?而有的程序,却在实现类似功能时,总要反复从头到尾进行修改?想知道其中的答案吗?
想避免走弯路,编写出清晰高效的代码吗?想掌握C十十的高级技术吗?想了解它的精妙之处吗?
上面的所有问题,都可以在本书中得到解答。本书的作者是贝尔实验室首批使用C十十的用户,在编程领域,他已经有将近20年的C十十使用时间,在编译器设计、电子商务、嵌入式远程通信、安全交易等领域,具有极为丰富的经验。
在本书中,作者将常见问题分类进行说明,并详细指出了避免出现问题的方法。这些问题有的最容易出错,有的最为危险,有的非常难以发现,也有的相当有趣。范围涉及到语法、预处理、转换、初始化、内存和资源管理、多态、类设计和分层设计。而且,对每个问题及其解决方案都通过代码实例进行详细的解释。
本书对于深入学习C十十语言, 有着极为实用的指导意义,适用于C十十程序员。
本书主要由陈君翻译,参与翻译的人员还有:王雷、陈河南、贺军、王春桥、李志云、贺民、龚亚萍、戴军、蒋方帅、孟丽艳等,在此表示感谢。
本书在翻译的过程中,查阅了相关的网站,根据其勘误表对书中的错误已进行了更正。
译 者
在实现同样的功能时,为什么有的程序员编写的程序读起来非常舒服,有的却让你头晕脑胀?为什么有的程序可以一再使用,而大幅提高工作效率?而有的程序,却在实现类似功能时,总要反复从头到尾进行修改?想知道其中的答案吗?
想避免走弯路,编写出清晰高效的代码吗?想掌握C十十的高级技术吗?想了解它的精妙之处吗?
上面的所有问题,都可以在本书中得到解答。本书的作者是贝尔实验室首批使用C十十的用户,在编程领域,他已经有将近20年的C十十使用时间,在编译器设计、电子商务、嵌入式远程通信、安全交易等领域,具有极为丰富的经验。
在本书中,作者将常见问题分类进行说明,并详细指出了避免出现问题的方法。这些问题有的最容易出错,有的最为危险,有的非常难以发现,也有的相当有趣。范围涉及到语法、预处理、转换、初始化、内存和资源管理、多态、类设计和分层设计。而且,对每个问题及其解决方案都通过代码实例进行详细的解释。
本书对于深入学习C十十语言, 有着极为实用的指导意义,适用于C十十程序员。
本书主要由陈君翻译,参与翻译的人员还有:王雷、陈河南、贺军、王春桥、李志云、贺民、龚亚萍、戴军、蒋方帅、孟丽艳等,在此表示感谢。
本书在翻译的过程中,查阅了相关的网站,根据其勘误表对书中的错误已进行了更正。
译 者
序言回到顶部↑
在近20年的编程生涯中,我曾经遇到过许多困难和挫折,所编写的程序也曾出现过严重的缺陷,我在电脑前度过了数不清的日日夜夜,放弃了周末和假日的休息,终于完成了本书。本书详细说明了99个常见的C十十编程陷阱,它们有的很严重,有的也很有趣,其中多数的问题都是我亲身经历的。
术语“陷阱(gotcha)”的发展历史并不明确,而且它有多种定义方法。本书将C十十陷阱定义为C十十编程和设计过程中常见的和可防止的问题。这里描述的陷阱所包括的范围广泛,从较容易的语法问题,基本设计缺陷,到完全错误的行为。
几乎在10年前,我就开始在C十十课程资料中解释各种陷阱。我的感觉是,利用正确的使用方法来说明这些常见的误解和误用,可以防止学生出现类似的问题,并防止新一代C十十程序员重复过去的错误。从大体上说,这种方法是卓有成效的,这促使我搜集更多相关的问题,并在讨论会上加以介绍。由于这些介绍受到了欢迎(也许是受到同样问题的困扰吧。),也就促使我编写了这本有关“陷阱”的书。
为了讨论如何避免出现C十十陷阱以及如何从中恢复,我们将会涉及到其他主题,最常见的是设计模式,习惯用法以及C十十语言特征的技术细节。
本书并不是有关设计模式的书籍,但是我们经常发现,模式是避免陷阱或者从特定陷阱中恢复的一种方法。从传统上说,模式名称是大写的,例如Template Method模式或者Bridge模式。当本书提到模式时,如果它们很简单,那么就只是简要地介绍它们的结构,但会详细地讨论如何使用它们。除非另外注明,否则完全可以在Erich Ganma等所著的《Design Patterns》中找到有关模式的更加完整的描述,以及对模式更加深入的讨论。在Robert Martin的《Agile Software Development》中介绍了Acryclic Visitor,Monostate和Null Object模式。
从陷阱的角度来看,设计模式有两个重要属性。首先,它们描述了经过实践证明的成功的设计技术,而且可以用与上下文相关的方法定制它们,以适应新的设计情况。其次,更加重要的是,提及特定的模式时,不仅说明了所应用的技术,而且说明了应用的原因以及结果。
例如,当看到在设计中使用Bridge模式时,从技术上来说,它已经将抽象数据类型实现分解为接口类和实现类。另外,其目的是为了更好地分离接口与实现,使得对实现的改动不会影响接口用户。我们还知道,这种分离会影响到运行时成本、编写抽象数据类型的源代码的方式,以及许多其他细节。
模式名称是了解有关这种技术的大量信息及经验的有效且明确的方法。在设计过程和说明文档中,仔细、准确地使用模式和模式术语,可以解释代码,并帮助用户防止出现陷阱。
C十十是复杂的编程语言,语言越复杂,则在编程中使用惯例就越重要。对于一种编程语言而言,惯例是常用的并被广泛理解为低级语言功能的组合,它可以构成更加高级的结构,这与模式在较高层次设计中的作用类似。因此在C十十中,我们可以讨论复制操作,函数对象,灵巧指针和引发异常,而不用在最低级的实现层次上规定这些概念。
必须指出,惯例并不仅仅是语言功能的组合,而且是一组期望的组合,它说明这些组合到一起的基本功能应该具有什么样的行为。复制操作意味着什么?当引发异常时,应该发生什么情况?在本书中找到的多数建议,将涉及在C十十编程和设计中的注意事项和使用惯例。可以简单地认为,这里列出的许多陷阱就是因为偏离了特定的C十十惯例,而遵循适当的惯例,就是问题的相关解决方案(参见陷阱10)。
本书主要介绍了一些C十十语言领域的微妙之处,它们经常被人们所误解,而且频繁地产生问题。其中某些内容比较神秘,不熟悉这些领域,便会带来问题,而且阻碍我们熟练地使用C十十。这些“死角”本身也非常有趣,很值得研究。它们由于某种理由而出现在C十十中,熟练的C什程序员经常在高级编程和设计中使用它们。
在陷阱和设计模式之间,另一个相关之处就是在描述相对简单实例时的类似重要性。简单的模式很重要。在某些方面,它们比技术上难以实现的模式更加重要,因为简单模式很可能使用得更加普遍。因此,更多的编程和设计群体更增加了模式说明所带来的好处。
本书以大致相同的方式描述了许多陷阱,它们覆盖了从易到难的较大范围,从简单地劝告要向有责任心的专家那样采取行动(陷阱12),到避免在虚拟继承下误解支配规则的警告(陷阱79)。但是与模式的情况类似,在日常生活中,更普遍的是负责任的举动,而不是支配规则。
有两个主题贯穿本书始终。第一个就是馈例的极端重要性。这一点在类似C十十这样的复杂语言中尤其重要。遵守现有的惯例,可以使我们与他人的沟通变得有效而准确。第二个主题就是认识到,其他人可能维护我们编写的代码。维护可能是直接的,那些资深的维护人员必须能够理解我们的代码,或者维护可能是间接的,在这种情况下,必须确保即使是远程修改代码,它仍然可以保持正确。
本书按问题介绍陷阱,每个问题描述了一个陷阱或者一组相关的陷阱,而且提出了如何避免或者纠正它们的建议。由于问题本身就是无序的,因此不能确保关于陷阱的任何书籍都是完全连贯的。然而,本书根据陷阱的一般本质或者(错误)应用的领域,将陷阱分配到各个章节中。
另外,讨论某个陷阱不可避免地会涉及其它的陷阱。在确实需要的地方(通常都需要),本书将明确地给出这些链接。每个陷阱内的连贯性有时也会出现问题。在开始介绍陷阱之前,通常需要介绍它出现的上下文。这个介绍可能需要讨论某种技术、惯例、模式或者语言的细微差别,在返回所提出的陷阱之前,这些内容可能让本书偏离主题。我尽量将这种跑题的情况减少到最低限度,但我认为,完全避免这种情况是不可能的。C十十中,高效编程要求巧妙地协调相当多的方面,因此在不涉及简单的相关问题集合的情况下,不可能有效地讨论它的起因。
读者可以不按从陷阱1到陷阱99的顺序来阅读本书,也不推荐这样的阅读方式。因为大量纷繁的混乱信息,将使读者偏离C十十编程的主题。更好的方法是从您经历过的陷阱开始,或者从听起来有趣的陷阱开始,并按照到相关陷阱的链接阅读。另外,也可以自由地阅读有关陷阱的内容。
书中采用了多种方法来帮助进行说明。首先,灰色背景代表不正确的或者不推荐使用的代码,而正确和适当的代码没有任何背景颜色。其次,文本中出现的代码经过编辑,以保持简洁和明确。这样的结果就是,如果没有其他的支撑代码,则无法编译所介绍的例子。可以从作者的网站www.semantics.org上下载重要例子的源代码。在本书中,用代码例子旁边的简写路径名称标明了所有这样的代码,如>>gotcha00/somecode.cpp。
最后要注意,不应将陷阱提升到与惯例或者模式相同的重要地位上。当需要时,适合设计或者编码上下文的模式或者惯例,将“自然地”从自己的潜意识中冒出来,这是说明正确使用了模式和惯例的一种迹象。
识别陷阱与对危险的条件反射类似,一朝被蛇咬,十年怕井绳。然而与比赛和打仗一样,为了学习如何识别和避免危险情况,并不需要一定被烧伤或者枪伤。一般情况下,必要条件就是提前警觉。本书可以作为在C十十陷阱前保持头脑冷静的一种方法。
术语“陷阱(gotcha)”的发展历史并不明确,而且它有多种定义方法。本书将C十十陷阱定义为C十十编程和设计过程中常见的和可防止的问题。这里描述的陷阱所包括的范围广泛,从较容易的语法问题,基本设计缺陷,到完全错误的行为。
几乎在10年前,我就开始在C十十课程资料中解释各种陷阱。我的感觉是,利用正确的使用方法来说明这些常见的误解和误用,可以防止学生出现类似的问题,并防止新一代C十十程序员重复过去的错误。从大体上说,这种方法是卓有成效的,这促使我搜集更多相关的问题,并在讨论会上加以介绍。由于这些介绍受到了欢迎(也许是受到同样问题的困扰吧。),也就促使我编写了这本有关“陷阱”的书。
为了讨论如何避免出现C十十陷阱以及如何从中恢复,我们将会涉及到其他主题,最常见的是设计模式,习惯用法以及C十十语言特征的技术细节。
本书并不是有关设计模式的书籍,但是我们经常发现,模式是避免陷阱或者从特定陷阱中恢复的一种方法。从传统上说,模式名称是大写的,例如Template Method模式或者Bridge模式。当本书提到模式时,如果它们很简单,那么就只是简要地介绍它们的结构,但会详细地讨论如何使用它们。除非另外注明,否则完全可以在Erich Ganma等所著的《Design Patterns》中找到有关模式的更加完整的描述,以及对模式更加深入的讨论。在Robert Martin的《Agile Software Development》中介绍了Acryclic Visitor,Monostate和Null Object模式。
从陷阱的角度来看,设计模式有两个重要属性。首先,它们描述了经过实践证明的成功的设计技术,而且可以用与上下文相关的方法定制它们,以适应新的设计情况。其次,更加重要的是,提及特定的模式时,不仅说明了所应用的技术,而且说明了应用的原因以及结果。
例如,当看到在设计中使用Bridge模式时,从技术上来说,它已经将抽象数据类型实现分解为接口类和实现类。另外,其目的是为了更好地分离接口与实现,使得对实现的改动不会影响接口用户。我们还知道,这种分离会影响到运行时成本、编写抽象数据类型的源代码的方式,以及许多其他细节。
模式名称是了解有关这种技术的大量信息及经验的有效且明确的方法。在设计过程和说明文档中,仔细、准确地使用模式和模式术语,可以解释代码,并帮助用户防止出现陷阱。
C十十是复杂的编程语言,语言越复杂,则在编程中使用惯例就越重要。对于一种编程语言而言,惯例是常用的并被广泛理解为低级语言功能的组合,它可以构成更加高级的结构,这与模式在较高层次设计中的作用类似。因此在C十十中,我们可以讨论复制操作,函数对象,灵巧指针和引发异常,而不用在最低级的实现层次上规定这些概念。
必须指出,惯例并不仅仅是语言功能的组合,而且是一组期望的组合,它说明这些组合到一起的基本功能应该具有什么样的行为。复制操作意味着什么?当引发异常时,应该发生什么情况?在本书中找到的多数建议,将涉及在C十十编程和设计中的注意事项和使用惯例。可以简单地认为,这里列出的许多陷阱就是因为偏离了特定的C十十惯例,而遵循适当的惯例,就是问题的相关解决方案(参见陷阱10)。
本书主要介绍了一些C十十语言领域的微妙之处,它们经常被人们所误解,而且频繁地产生问题。其中某些内容比较神秘,不熟悉这些领域,便会带来问题,而且阻碍我们熟练地使用C十十。这些“死角”本身也非常有趣,很值得研究。它们由于某种理由而出现在C十十中,熟练的C什程序员经常在高级编程和设计中使用它们。
在陷阱和设计模式之间,另一个相关之处就是在描述相对简单实例时的类似重要性。简单的模式很重要。在某些方面,它们比技术上难以实现的模式更加重要,因为简单模式很可能使用得更加普遍。因此,更多的编程和设计群体更增加了模式说明所带来的好处。
本书以大致相同的方式描述了许多陷阱,它们覆盖了从易到难的较大范围,从简单地劝告要向有责任心的专家那样采取行动(陷阱12),到避免在虚拟继承下误解支配规则的警告(陷阱79)。但是与模式的情况类似,在日常生活中,更普遍的是负责任的举动,而不是支配规则。
有两个主题贯穿本书始终。第一个就是馈例的极端重要性。这一点在类似C十十这样的复杂语言中尤其重要。遵守现有的惯例,可以使我们与他人的沟通变得有效而准确。第二个主题就是认识到,其他人可能维护我们编写的代码。维护可能是直接的,那些资深的维护人员必须能够理解我们的代码,或者维护可能是间接的,在这种情况下,必须确保即使是远程修改代码,它仍然可以保持正确。
本书按问题介绍陷阱,每个问题描述了一个陷阱或者一组相关的陷阱,而且提出了如何避免或者纠正它们的建议。由于问题本身就是无序的,因此不能确保关于陷阱的任何书籍都是完全连贯的。然而,本书根据陷阱的一般本质或者(错误)应用的领域,将陷阱分配到各个章节中。
另外,讨论某个陷阱不可避免地会涉及其它的陷阱。在确实需要的地方(通常都需要),本书将明确地给出这些链接。每个陷阱内的连贯性有时也会出现问题。在开始介绍陷阱之前,通常需要介绍它出现的上下文。这个介绍可能需要讨论某种技术、惯例、模式或者语言的细微差别,在返回所提出的陷阱之前,这些内容可能让本书偏离主题。我尽量将这种跑题的情况减少到最低限度,但我认为,完全避免这种情况是不可能的。C十十中,高效编程要求巧妙地协调相当多的方面,因此在不涉及简单的相关问题集合的情况下,不可能有效地讨论它的起因。
读者可以不按从陷阱1到陷阱99的顺序来阅读本书,也不推荐这样的阅读方式。因为大量纷繁的混乱信息,将使读者偏离C十十编程的主题。更好的方法是从您经历过的陷阱开始,或者从听起来有趣的陷阱开始,并按照到相关陷阱的链接阅读。另外,也可以自由地阅读有关陷阱的内容。
书中采用了多种方法来帮助进行说明。首先,灰色背景代表不正确的或者不推荐使用的代码,而正确和适当的代码没有任何背景颜色。其次,文本中出现的代码经过编辑,以保持简洁和明确。这样的结果就是,如果没有其他的支撑代码,则无法编译所介绍的例子。可以从作者的网站www.semantics.org上下载重要例子的源代码。在本书中,用代码例子旁边的简写路径名称标明了所有这样的代码,如>>gotcha00/somecode.cpp。
最后要注意,不应将陷阱提升到与惯例或者模式相同的重要地位上。当需要时,适合设计或者编码上下文的模式或者惯例,将“自然地”从自己的潜意识中冒出来,这是说明正确使用了模式和惯例的一种迹象。
识别陷阱与对危险的条件反射类似,一朝被蛇咬,十年怕井绳。然而与比赛和打仗一样,为了学习如何识别和避免危险情况,并不需要一定被烧伤或者枪伤。一般情况下,必要条件就是提前警觉。本书可以作为在C十十陷阱前保持头脑冷静的一种方法。
相关资源回到顶部↑
· 【推荐】众多高校学子口口相传,他们共同的选择--华清远见嵌入式学院(嵌入式Linux就业课程、3G手机开发就业课程,通过入学测试即签100%就业协议,4个月集中实训,世界500强企业成功就业保障!!!)· 【亚嵌教育 嵌入式培训专家】(嵌入式培训,嵌入式Linux培训,ARM培训,Linux培训,3G培训,Android培训,WINCE培训,DSP培训,FPGA培训,嵌入式就业培训)
· 程序员的7种武器(正则表达式、编程语言、数据库、算法、软件调试、开发环境)
· C/C++ 经典著作(《C专家编程》《C++ Templates中文版》《C和指针 》《C陷阱与缺陷》《C++沉思录》)
评论交流
共有10人开贴评论 20人参与评论 7人参与打分 查看
评价等级:

发表于:2003-6-28 10:51:00
大家千万不要上当,我看了一遍,翻译的非常一般,一般的C++高手读起来也得费半天劲。
原版书在国外的评价也很一般,不知道china-pub为什么还弄个“热销”?,谁那么想不开,没事就买书,只买不看啊?
还是看看:
《Effective C++》
《More Effectivec C++》
《Exceptional C++》
《More Exceptional C++》
由上面这四本书,在加上《C++编程思想》或者《C++ Primer 3RD》就可以了。
如果是很牛B的那种技术狂人,你可以再去看看
《深入探索C++对象模型》、《C++沉思录》等。
反正啊,这本书很一般,建议别看。
原版书在国外的评价也很一般,不知道china-pub为什么还弄个“热销”?,谁那么想不开,没事就买书,只买不看啊?
还是看看:
《Effective C++》
《More Effectivec C++》
《Exceptional C++》
《More Exceptional C++》
由上面这四本书,在加上《C++编程思想》或者《C++ Primer 3RD》就可以了。
如果是很牛B的那种技术狂人,你可以再去看看
《深入探索C++对象模型》、《C++沉思录》等。
反正啊,这本书很一般,建议别看。
| 我要写评论 |
| 查看所有评论交流(共10条) |








点击看大图




加载中...

