More Effective C++中文版35个改善编程与设计的有效方法[按需印刷]
基本信息
编辑推荐
和它的姊妹篇《Effective C++》搭配,是每个C++开发者必不可少的书籍。
这是一本在C++的诸多方面都给人以启迪的书籍:不论是在很少用到的语言特性上,还是在你自以为十分熟悉的语言特性上。只有深刻了解C++编译器是如何解释代码的,你才有可能使用这门语言编写出健壮的软件。本书是帮助你达到这种理解层次的一份极具价值的资料。读过本书之后,我感觉像是和一个C++编程大师一起做了一次代码复查(code review),并从他那里获得了许多真知灼见。
——Fred Wild,技术副总裁,Advantage Software echnologies
推荐阅读
内容简介回到顶部↑
本书通过示例的方式详细论述了使用c++进行程序设计的高效方法。内容包括分区指针、引用、类型转换、运算符、异常、效率、引用计数、代理类以及虚函数等内容。
本书内容全面丰富,论述详实清晰,作者权威且经验丰富,是c++程序员必备读物。
作者简介:
迈耶斯,(scott meyers)拥有布朗大学计算机科学博士学位,是世界上最著名的c++软件开发权威之一。他的“effective c++两卷本”(《effective c++》和《more effective c++》),开辟了技术图书写作的新风格。他曾担任《c++report》杂志的专栏作家,经常为《c/c++users journal》和《dr.dobb's journal》撰稿。
本书内容全面丰富,论述详实清晰,作者权威且经验丰富,是c++程序员必备读物。
作者简介:
迈耶斯,(scott meyers)拥有布朗大学计算机科学博士学位,是世界上最著名的c++软件开发权威之一。他的“effective c++两卷本”(《effective c++》和《more effective c++》),开辟了技术图书写作的新风格。他曾担任《c++report》杂志的专栏作家,经常为《c/c++users journal》和《dr.dobb's journal》撰稿。
作译者回到顶部↑
本书提供作译者介绍
Scott Meyers,拥有布朗大学计算机科学博士学位,是世界上最著名的C++软件开发权威之一。他的“Effective C++两卷本” (《Effective C++》和《More Effective C++》),开辟了技术图书写作的新风格。他曾担任《C++ Report》杂志的专栏作家,经常为《C/C++ Users Journal》和《Dr.Dobb's Journal》撰稿。...
.. << 查看详细
.. << 查看详细
目录回到顶部↑
“c++设计新思维”丛书前言
对本书的赞誉
译者序
引言
致谢
第1章 基础议题
条款1:区分指针和引用
条款2:优先考虑c++风格的类型转换
条款3:决不要把多态应用于数组
条款4:避免不必要的默认构造函数
第2章 运算符
条款5:小心用户自定义的转换函数
条款6:区分自增运算符和自减运算符的前缀形式与后缀形式
条款7:不要重载“&&”、“ii”和“,”
条款8:理解new和delete在不同情形下的含义
第3章 异常
条款9:使用析构函数防止资源泄漏
条款10:防止构造函数里的资源泄漏
条款11:阻止异常传递到析构函数以外
条款12:理解抛出异常与传递参数或者调用虚函数之间的不同
对本书的赞誉
译者序
引言
致谢
第1章 基础议题
条款1:区分指针和引用
条款2:优先考虑c++风格的类型转换
条款3:决不要把多态应用于数组
条款4:避免不必要的默认构造函数
第2章 运算符
条款5:小心用户自定义的转换函数
条款6:区分自增运算符和自减运算符的前缀形式与后缀形式
条款7:不要重载“&&”、“ii”和“,”
条款8:理解new和delete在不同情形下的含义
第3章 异常
条款9:使用析构函数防止资源泄漏
条款10:防止构造函数里的资源泄漏
条款11:阻止异常传递到析构函数以外
条款12:理解抛出异常与传递参数或者调用虚函数之间的不同
译者序回到顶部↑
《More Effective C++》的英文影印版已由机械工业出版社引进出版。《More Effective C++》英文版自第一次印刷以来,至今销售已超过数十万册,译者手头的英文原书是2005年8月份第21次印刷的版本。本书的经典性和它的姊妹篇《Effective C++》一样毋庸置疑。相比《Effective C++》,本书对于运算符重载、默认构造函数、异常处理、延迟计算(lazy evaluation)、代理类(proxy class)、智能指针(smart pointer)、双重分派(doubledispatching)等主题进行了深入和详尽的讨论。毫无疑问,这些主题是每个从事C++程序开发的专业人员都应该掌握的内容。另一方面,正如作者在本书英文版的网页上所指出的那样,随着以模板为代表的C++新技术的逐步深入人心,本书的某些条款需要以发展的眼光去看待,比如说,boost∶∶assign库以提供反例的形式为本书中关于运算符重载的条款给出了更好的注解;以shared_ptr为代表的boost智能指针库和《Modern C++ Design》一书提供的基于Policy的智能指针设计,都针对智能指针这个主题提供了更为完善的解决方案。此外,本书使用相当篇幅进行讨论的双重分派(doubledispatching)问题,在《Modern C++ Design》一书中也通过使用模板给出了更为完美的解决方案。鉴于此,对这些主题有兴趣的读者在阅读完本书以后,可以进一步研究《Modern C++ Design》一书中的相关内容。.
在此,首先要感谢《Imperfect C++》和《Exceptional C++ Style》等书的译者刘未鹏把我介绍给机械工业出版社华章公司的陈冀康编辑。感谢我的同事吉子军和葛小果不厌其烦地与我讨论技术上的一些细节问题。另外,还要感谢陈高兵和乔茜在我翻译此书的过程中为我提供了舒适的工作环境。..
关于本书,译者惟一的心愿就是希望这个译本没有辜负英文原版的名声。如果您对这个译本有任何意见或者建议,您可以通过liuxiaoweide@gmailcom与我联系。另外,我也会http://blogcsdnnet/lxwde上维护本书的一个勘误表。...
刘晓伟
2006年12月
在此,首先要感谢《Imperfect C++》和《Exceptional C++ Style》等书的译者刘未鹏把我介绍给机械工业出版社华章公司的陈冀康编辑。感谢我的同事吉子军和葛小果不厌其烦地与我讨论技术上的一些细节问题。另外,还要感谢陈高兵和乔茜在我翻译此书的过程中为我提供了舒适的工作环境。..
关于本书,译者惟一的心愿就是希望这个译本没有辜负英文原版的名声。如果您对这个译本有任何意见或者建议,您可以通过liuxiaoweide@gmailcom与我联系。另外,我也会http://blogcsdnnet/lxwde上维护本书的一个勘误表。...
刘晓伟
2006年12月
前言回到顶部↑
对C++程序员而言,现在是令人振奋的时代。尽管C++商业化尚不足10年,却已然成为几乎所有主要计算平台的系统编程语言。越来越多的面临挑战性编程问题的公司和个人不断投入C什的怀抱,那些尚未使用C++的人们则通常被问及何时(而非是否)开始使用C++。C++标准化工作本质上已经完成,其附带的标准库范围之广(涵盖并胜过C标准库),使我们得以在不牺牲移植性或不必从头实现常用算法和数据结构的情况下编写出丰富的复杂程序。C++编译器数量不断增加,它们提供的语言特性持续扩张,产生的代码质量也不断得到改善。用于C++程序开发的工具和环境越发丰富、强大且健壮。商业库几乎可以消除在很多应用领域中编写代码的需要。.
由于C++语言已经成熟并且我们对其使用经验日益增多,我们需要的信息也发生了变化。在1990年,人们希望知道C+十是什么。而到了1992年,他们则希望知道如何使用它。今天,C++程序员则提出了更高级的问题:如何设计软件才能使其适应将来的需要?如何在不危及正确性和易用性的前提下提高代码的效率?如何实现语言未直接提供支持的复杂功能?
在本书中,我将回答这些问题以及其他许多诸如此类的问题。
本书向你展示如何设计和实现更有效的C++软件,即,行为的正确性有着更好的保证、发生异常时表现更为健壮、更高效、移植性更好、更好地运用了语言特性、更优雅地适应变化、在混合语言环境中工作得更好、更易被正确使用、更不易被误用的C++软件。简而言之,就是设计和实现出更好的软件。
本书内容被划分为35个条款。每一个条款都总结了C++编程社群在特定主题上的智慧积累。大部分条款以指导方针的形式呈现,伴随每一个方针的解说则描述了该方针为何存在、倘若不遵循该方针将会发生什么后果,以及在什么情形下你有理由违反该方针。
这些条款被分为几大类。一些条款关注特定的语言特性,尤其是你可能缺乏使用经验的较新特性。例如,条款9~条款15专注于异常主题。另外一些条款则解释如何结合运用语言的各色特性以实现更高级的目标。例如,条款25-条款31描述如何约束对象创建的个数和地点,如何根据一个以上的对象类型创建表现出“虚拟性”的函数,如何创建“智能指针”,等等。还有其他一些条款讨论更广泛的主题,条款16-条款24专注于讨论效率。不论一个特定的条款讨论的是什么主题,它们都提供了具有实效的途径。在本书中,你将学习到如何更有效地使用C++。那些构成大多数c抖教材的语言特性描述,在本书中只是作为背景信息出现。
这种讲解方式意味着在阅读本书之前你就应该熟悉C++。这里假定你已了解类、保护级别、虚函数和非虚函数等,还假定你已经熟悉模板和异常背后蕴藏的理念。但我并不期望你是一位语言专家,所以当触及不那么为人熟知的C++特性时,我总会给出必要的解释。
本书所述的C++
本书中描述的C++是1998年国际标准委员会定义的C++语言。这意味着我可能使用了你手头的编译器尚不支持的一些语言特性。别担心,我猜对你而言惟一的“新”特性应该是模板,但现在几乎所有编译器都提供了对它的支持。我还使用了异常,但主要局限于条款9~条款15,这几个条款特别专注于讨论异常。如果你手头的编译器不支持异常机制,没关系,这并不会影响你学习本书其余部分内容。进一步而言,即便你手头没有支持异常的编译器,也应该阅读条款9~条款15,因为这些条款检视了任何情况下你都需要理解的议题。
我承认,仅凭标准委员会授意某一语言特性或认可某种实践,并不能保证该语言特性已得到目前编译器的支持,或该实践可应用于已有的开发环境中。当面临理论和实践之间的差异时,我对两者都加以讨论,尽管我更偏向于可以工作的实践。正因为两者都进行讨论,所以当你的编译器和C++标准不一致时,本书可以助你一臂之力,并向你展示如何使用现有构造来模拟你手头的编译器尚未支持的语言特性。当你决定将一些迂回方式转换为新支持的语言特性时,本书亦将给你指导。..
由于不同的编译器实现对C++标准的遵从度不同,因此建议你至少在两种编译器环境下编写代码。这有助于让你避免无意中依赖于某个厂商的专有语言扩展或它对标准的曲解,还有助于让你避免使用“新锐”编译器技术(例如,只有一家厂商提供的新语言特性支持)。此类语言特性通常实现得不够好(充满bug或速度慢或兼而有之),而且在对它们的介绍方面,C++社群尚缺乏经验,无法为你提供如何正确地使用它们的忠告。摧枯拉朽固然令人兴奋,但当你的目标是生产可靠的代码时,最好还是能够让他人在一头扎入之前先试试水之深浅。
你将在本书中看到两个你可能不太熟悉的C++构造,两者都是相对较晚出现的语言扩展。一些编译器支持它们,但如果你的编译器不支持,可以很容易地利用你熟悉的特性模拟之。
第一个构造是bool类型,其值为关键字true或fMse。如果你的编译器尚未实现bool,有两种模拟方式。其一是使用全局枚举:
enum bool{false,true);
这种方式允许你根据函数带有一个bool还是int对其进行重载,缺点是内建的比较操作符(即==、[、]:等)仍然传回int。结果导致如下代码的行为不像我们预期的那样:
void f(int);
void f(bool);
int x,y;
f(x[y);//调用f(int),其实应该调用f(b001)
当你将代码提交给真正支持bool类型的编译器时,这种采用枚举模拟bool的方式可能会导致代码的行为发生改变。
由于C++语言已经成熟并且我们对其使用经验日益增多,我们需要的信息也发生了变化。在1990年,人们希望知道C+十是什么。而到了1992年,他们则希望知道如何使用它。今天,C++程序员则提出了更高级的问题:如何设计软件才能使其适应将来的需要?如何在不危及正确性和易用性的前提下提高代码的效率?如何实现语言未直接提供支持的复杂功能?
在本书中,我将回答这些问题以及其他许多诸如此类的问题。
本书向你展示如何设计和实现更有效的C++软件,即,行为的正确性有着更好的保证、发生异常时表现更为健壮、更高效、移植性更好、更好地运用了语言特性、更优雅地适应变化、在混合语言环境中工作得更好、更易被正确使用、更不易被误用的C++软件。简而言之,就是设计和实现出更好的软件。
本书内容被划分为35个条款。每一个条款都总结了C++编程社群在特定主题上的智慧积累。大部分条款以指导方针的形式呈现,伴随每一个方针的解说则描述了该方针为何存在、倘若不遵循该方针将会发生什么后果,以及在什么情形下你有理由违反该方针。
这些条款被分为几大类。一些条款关注特定的语言特性,尤其是你可能缺乏使用经验的较新特性。例如,条款9~条款15专注于异常主题。另外一些条款则解释如何结合运用语言的各色特性以实现更高级的目标。例如,条款25-条款31描述如何约束对象创建的个数和地点,如何根据一个以上的对象类型创建表现出“虚拟性”的函数,如何创建“智能指针”,等等。还有其他一些条款讨论更广泛的主题,条款16-条款24专注于讨论效率。不论一个特定的条款讨论的是什么主题,它们都提供了具有实效的途径。在本书中,你将学习到如何更有效地使用C++。那些构成大多数c抖教材的语言特性描述,在本书中只是作为背景信息出现。
这种讲解方式意味着在阅读本书之前你就应该熟悉C++。这里假定你已了解类、保护级别、虚函数和非虚函数等,还假定你已经熟悉模板和异常背后蕴藏的理念。但我并不期望你是一位语言专家,所以当触及不那么为人熟知的C++特性时,我总会给出必要的解释。
本书所述的C++
本书中描述的C++是1998年国际标准委员会定义的C++语言。这意味着我可能使用了你手头的编译器尚不支持的一些语言特性。别担心,我猜对你而言惟一的“新”特性应该是模板,但现在几乎所有编译器都提供了对它的支持。我还使用了异常,但主要局限于条款9~条款15,这几个条款特别专注于讨论异常。如果你手头的编译器不支持异常机制,没关系,这并不会影响你学习本书其余部分内容。进一步而言,即便你手头没有支持异常的编译器,也应该阅读条款9~条款15,因为这些条款检视了任何情况下你都需要理解的议题。
我承认,仅凭标准委员会授意某一语言特性或认可某种实践,并不能保证该语言特性已得到目前编译器的支持,或该实践可应用于已有的开发环境中。当面临理论和实践之间的差异时,我对两者都加以讨论,尽管我更偏向于可以工作的实践。正因为两者都进行讨论,所以当你的编译器和C++标准不一致时,本书可以助你一臂之力,并向你展示如何使用现有构造来模拟你手头的编译器尚未支持的语言特性。当你决定将一些迂回方式转换为新支持的语言特性时,本书亦将给你指导。..
由于不同的编译器实现对C++标准的遵从度不同,因此建议你至少在两种编译器环境下编写代码。这有助于让你避免无意中依赖于某个厂商的专有语言扩展或它对标准的曲解,还有助于让你避免使用“新锐”编译器技术(例如,只有一家厂商提供的新语言特性支持)。此类语言特性通常实现得不够好(充满bug或速度慢或兼而有之),而且在对它们的介绍方面,C++社群尚缺乏经验,无法为你提供如何正确地使用它们的忠告。摧枯拉朽固然令人兴奋,但当你的目标是生产可靠的代码时,最好还是能够让他人在一头扎入之前先试试水之深浅。
你将在本书中看到两个你可能不太熟悉的C++构造,两者都是相对较晚出现的语言扩展。一些编译器支持它们,但如果你的编译器不支持,可以很容易地利用你熟悉的特性模拟之。
第一个构造是bool类型,其值为关键字true或fMse。如果你的编译器尚未实现bool,有两种模拟方式。其一是使用全局枚举:
enum bool{false,true);
这种方式允许你根据函数带有一个bool还是int对其进行重载,缺点是内建的比较操作符(即==、[、]:等)仍然传回int。结果导致如下代码的行为不像我们预期的那样:
void f(int);
void f(bool);
int x,y;
f(x[y);//调用f(int),其实应该调用f(b001)
当你将代码提交给真正支持bool类型的编译器时,这种采用枚举模拟bool的方式可能会导致代码的行为发生改变。
相关资源回到顶部↑
· 精彩书评..
· 【推荐】众多高校学子口口相传,他们共同的选择--华清远见嵌入式学院(嵌入式Linux就业课程、3G手机开发就业课程,通过入学测试即签100%就业协议,4个月集中实训,世界500强企业成功就业保障!!!)· 【亚嵌教育 嵌入式培训专家】(嵌入式培训,嵌入式Linux培训,ARM培训,Linux培训,3G培训,Android培训,WINCE培训,DSP培训,FPGA培训,嵌入式就业培训)
· 程序员的7种武器(正则表达式、编程语言、数据库、算法、软件调试、开发环境)
· C/C++ 经典著作(《C专家编程》《C++ Templates中文版》《C和指针 》《C陷阱与缺陷》《C++沉思录》)








点击看大图







加载中...

