我推荐的一些C\C++书籍
原文链接: 我推荐的一些C\C++书籍
人们常常问我有什么C++和编程的书籍推荐,也许是因为我在PowerDNS有一个关于“编写可读性良好的C++代码”的演讲。这篇博文可以作为我对上述问题的一个回答,同时也包含了一些更广泛的笔记编程。如果你有任何补充或喜欢的书籍但是我没有提到,请给留言提示,我打算一有新书就更新这个页面。
第一个注意项:如果你打算学习C++,请务必学习最新版的C++ 2011。这个版本的C++移除了许多由C++强大带来的一些痛苦之处。另外,也不用担心C++ 2014的书籍,大多数编译器已经开始支持它了。
学习编程
学习编程包含以下几个重要方面:
- 了解语言的语法
- 知道那些特性可以使用和何时使用
- 写出可读性好的代码
- 编译器可以理解,但是下一个人是否可以阅读呢?
- 在一个更高层次设计结构良好的程序
为了学习一门语言,通常我们可以找到叫《X语言编程》的书。这也形成了一个潜规则:当你创建一门严肃的语言的时候,你需要编写这样一本书。学习语言有点像学习作文,但这并不意味着你能够突然变成一个著名散文作家!
对于C++,这里有两本相关的书:
- 《C程序设计语言》 (Brian W. Kernighan, Denis M. Ritchie, TCPL)。这本书不是关于C++的,不过所有与C有关的东西都和C++有关。例如,这本书附带的例子都可以看作C++的例子,只是不是真正的C,因为C++比C的编译器要求更加严格。但是大部分编写良好的C程序都可以在C++下编译通过,TCPL是一本小书,并且被誉为X语言编程中最好的书籍。书中每一页都充满智慧。
- 《C++程序设计语言》(Bjarne Stroustrup),一本杰出的书,书中的每一页同样充满智慧。这本书有1400页。Verity Stob对这本书有热烈的评论。在TCPL中,我们读到的是“C不是一个大的语言,因此也不需要一本长篇大论的书来讲解”,但是讲解C++的书却有1400页。尽管这本书很难一页一页地读下去(不过,我几乎读过了书中的每一页),但是我建议每个人都拥一本。它讲解了C++中的每一个方面,并且讲解得非常不错。有这本书可以作为C++的参考,你的编程生涯会受益良多。
我需要声明一点,《C程序设计语言》不是一本学习C++的入门书籍,这本书是用来指导你学习的,同时,《C程序设计语言》也单独提取了《A
Tour of C++ 》篇章。
C++不仅是一门语言,也是指一个函数库。在《C++程序设计语言》中也讲解了C++标准库,为了全面了解C++标准库,我推荐:
- 《C++标准程序库:自修教程与参考手册》(Nikolai Josuttis),和《C++程序设计语言》一样,这也是一本大部头的书。但是这本书涵盖了C++标准库的每一个方面(同时,也被称作C++标准模版库),第二版中涵盖了C++2011标准。
如果你之前从事高级语言比如python,perl或者java,C和C++可能让人生畏。不像其他语言,C/C++非常接近硬件。这也有一个优点,可以充分利用硬件优势,但也让你需要面对现实细节。Simon
Tatham (作为Putty的开发者和编写《缺失代码怪味》的作者而知名,虽然他现在使用C开发)写了一篇非常棒的文档:《The
Descent to C》,这会降低你的学习难度,甚至经验丰富的C开发者也可能受益一二。
如果你读了上面三本书和链接,你已经可以熟练掌握C++了,并且善用C++标准库。不过,你还没有学习如何使用和何时适合使用C++的特性。C++作为一门强大的语言,有句话说:“使用C,你犯错可能砸到自己的脚,而使用C++,你犯错可能导致你整条腿都废了“,这说的都是真的。
另外,C++强大之处在于你可以继续使用你之前语言的开发方式。“我可以在任何语言中写编写FORTRAN代码”。不过这样不利于你成为一个更好的开发者。
用好C++
这里也有三本书,作者都是Scott Meyers,这将大大简化一个立志于C++开发的人的生活:
- 《Effective C++ 》——列举了一些常见错误,有用的特性和编程中需要注意的事项。最近更新于2005年。
- 《More Effective
C++》——和上面一样,不过讲述得更多一些,同样值得你去阅读。 - 《Effective STL》——最后更新于2001年,和《Effective C++》一样,不过关注于C++标准库。
如果你只想读其中一本,选择《Effective C++》,如果你想选择两本,再选择《Effective STL》。
需要注意的是,Scott正在准备一本新的书,全面覆盖了新的C++2014标准(这可以看着是对C++2011标准的改进,并且当前大多数编译器已经支持了C++2014)。一旦这本书出版,你应当第一时间购入,本书的预览部分已经看起来相当棒了。
更新:许多读者都推荐了Stanley Lippman的《C++ Primer》,我不了解这本书,不过它更新了C++2011标准并且收到了很多赞誉,请告诉我你的观点。
编写良好的代码
下面提到的书都讨论了代码风格,如果编写代码,不过它们其实范围更广。指导你如何编写可读性好的代码的书有:
- 《程序设计实践》,(Brian W. Kernighan, Rob Pike, TPoP),这不是一本特定于C++的书,不过谈论了许多关于如何组织代码,何时优化代码,何时不做优化,如果调试和如何编写代码避免调试等等,我觉得每个开发组织都应该有这样一本书。
- 《Linux内核代码规范》(Linus
Torvalds),这也不是一本关于C++的书,但是在第4节“命名”,第六节“函数”和第八节“注释”中,我们都可以学习到许多。
每个想要提高其代码的程序员最好认真阅览《程序设计实践》的每一页。
设计大规模的代码
我只知道一本书讲述了这一点,我的一些思想形成也有赖于它。
- 《Large-Scale
C++ Software Design 》(John Lakos),尽管本书有些年头,里面的一些建议用于指导当初为缺乏存储并且性能低下的机器开发程序的人们,从这本书我学习了如何将一个复杂系统拆解为多个有意义的模块。特别需要注意的是在循环中处理依赖代码。那些额外出现的细节,使得你的代码几乎不能测试,因为每个模块都非常依赖其他模块。
最后,祝学习C++的童鞋进步!
我推荐的一些C\C++书籍的更多相关文章
- 推荐一些不错的计算机书籍(php c mysql linux等等)
推荐一些不错的计算机书籍. # PHP<PHP程序设计>(第2版) --PHP语法和入门最好的书<PHP5权威编程> --PHP入门后升级书<深入PHP:面向对象.模 ...
- 值得推荐的10本PHP书籍(转)
值得推荐的10本PHP书籍(转) 一.总结 一句话总结: 二.值得推荐的10本PHP书籍 本篇文章的目的是想较全面地推荐10本PHP书籍,暂不讨论Linux/NGINX/Mysql等其他丛书. 前言 ...
- 推荐 10 本 Go 经典书籍,从入门到进阶(含下载方式)
书单一共包含 10 本书,分为入门 5 本,进阶 5 本.我读过其中 7 本,另外 3 本虽然没读过,但也是网上推荐比较多的. 虽然分了入门和进阶,但是很多书中这两部分内容是都包含了的.大家看的时候可 ...
- DevOps书单:调研了101名专家,推荐这39本必读书籍
任何一个领域都遵循从新人到熟手,从熟手到专家的路径.在成长过程中,DevOps人经常会陷入没人带,没人管,找不到职业方向的迷茫. DevOps是在商业演进与企业协作的进化过程中诞生的一个全新职业,被很 ...
- [Z]牛人林达华推荐有关机器学习的数学书籍
1. 线性代数 (Linear Algebra): 我想国内的大学生都会学过这门课程,但是,未必每一位老师都能贯彻它的精要.这门学科对于Learning是必备的基础,对它的透彻掌握是必不可少的.我在科 ...
- 推荐一本学习Groovy的书籍Groovy程序设计!
有朋友公司在用groovy开发,于是推荐我学习一下,搜到了这本书: 花了一个月时间读完了这本书!写的很棒,几乎没有废话,全书都是很重要的知识点和很好的讲解,确实像封面说的那样,使用的好可以提高开发效率 ...
- python官方推荐的各阶段学习书籍
Python学习交流群:463024091,群内每天分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎各位小伙伴入群学习交流! 你是否曾经学期初立下一大堆学习计划,到期末却依旧过着 ...
- flex外包团队—北京动点软件:推荐一本不错的Flex书籍
内容介绍:Ready to put your ActionScript 3 skills to work on mobile apps? This hands-on book walks you th ...
- 计算机科学书籍推荐和CSS、js书籍推荐
计算机科学:<深入理解计算机系统>,这是基础知识 JavaScript:JavaScript高级程序设计:大名鼎鼎的红宝书 <精通CSS:高级Web标准解决方案>:因为我觉CS ...
随机推荐
- sublime 添加 注释插件 Docblockr
https://github.com/spadgos/sublime-jsdocs Package Control Open Package Control: Preferences -> Pa ...
- Linux vim 中文显示乱码解决方法
因为在windows下默认是gb编码,而我的vim默认是utf-8(gedit默认也是utf-8),所以打开会成乱码.改动了一下配置文件,使vi支持gb编码就好了.$vi ~/.vimrclet &a ...
- LeetCode:删除排序链表中的重复元素【83】
LeetCode:删除排序链表中的重复元素[83] 题目描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示 ...
- [原创]java WEB学习笔记05:Servlet中的ServletConfig对象
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 使用deepfashion实现自己的第一个分类网络
这个过程主要分为三个步骤: 数据预处理 数据处理就是把数据按照一定的格式写出来,以便网路自己去读取数据 1准备原始数据 我的cloth数据一共是四个类别,每个类别有衣服47张,一用是188张图片,这些 ...
- codeforces 707D:Persistent Bookcase
Description Recently in school Alina has learned what are the persistent data structures: they are d ...
- Spark- RDD简介
Spark里面提供了一个比较重要的抽象——弹性分布式数据集(resilient distributed dataset),简称RDD.弹性:数据可大可小,可分布在内存或磁盘,当某台机器宕机时,能够按照 ...
- JS命令模式个人理解
JS命令模式个人理解 //BODY部分<body> <button id="execute">打开电视</button> <button ...
- django实现用户注册、登录、退出
视图 from django.contrib import auth from django.contrib.auth.models import User from django.views.dec ...
- linux应用之vim的常用命令
vim 选择文本,删除,复制,粘贴 文本的选择,对于编辑器来说,是很基本的东西,也经常被用到,总结如下: v 从光标当前位置开始,光标所经过的地方会被选中,再按一下v结束. V 从光标当前行开始,光标 ...