C++ Primer中文版(第5版)(顶级畅销书重磅升级全面采用最新 C++ 11标准)ios
【美】Stanley B. Lippman( 斯坦利李普曼) Josee Lajoie(约瑟拉乔伊 ) Barbara E. Moo (芭芭拉默) 著程序员
王刚 杨巨峰译正则表达式
ISBN 978-7-121-15535-2算法
2013年9月出版编程
订价:128.00元数组
864页安全
16开
数据结构
编辑推荐 多线程
C++领域权威 潘爱民|孟岩做序,表明技术圈鼎力推荐 架构
一线C++工程师腾讯Milo、微软刘未鹏|陈梓瀚、阿里李云|侯凤林高水准技术审校
若是只读一本C++书籍,相信全部读过的人都会绝不犹豫选择本书,不管初学或老手
既可用来理解C++11规则背后的原理,也可用其新语言特性与标准库来快速构建健壮程序
采用中文版页码全面呈现原书大量交叉引用及详尽索引,新式辅学设置与课后操练用于避开陷阱、巩固良法
内容提要
这本久负盛名的 C++经典教程,时隔八年之久,终迎来前所未有的重大升级。除令全球无数程序员从中受益,甚至为之迷醉的——C++ 大师 Stanley B. Lippman 的丰富实践经验,C++标准委员会原负责人 Josée Lajoie 对C++标准的深刻理解,以及C++ 先驱 Barbara E. Moo 在 C++教学方面的真知灼见外,更是基于全新的 C++11标准进行了全面而完全的内容更新。很是难能难得的是,《C++ Primer 中文版(第5版)》全部示例均所有采用 C++11 标准改写,这在经典升级版中极其罕见——充分体现了 C++ 语言的重大进展及其全面实践。书中丰富的教学辅助内容、醒目的知识点提示,以及精心组织的编程示范,让这本书在 C++ 领域的权威地位更加不可动摇。不管是初学者入门,或是中、高级程序员提高,本书均为无可置疑的首选。
目录
第1章 开始 1
第2章 变量和基本类型 29
第3章 字符串、向量和数组 73
第4章 表达式 119
第5章 语句 153
第6章 函数 181
第7章 类 227
第8章 IO库 277
第9章 顺序容器 291
第10章 泛型算法 335
第11章 关联容器 373
第12章 动态内存 399
第13章 拷贝控制 439
第14章 操做重载与类型转换 489
第15章 面向对象程序设计 525
第16章 模板与泛型编程 577
第17章 标准库特殊设施 635
第18章 用于大型程序的工具 683
第19章 特殊工具与技术 725
C++11的新特性
2.1.1 long long类型 31
2.2.1 列表初始化 39
2.3.2 nullptr常量 48
2.4.4 constexpr变量 59
2.5.1 类型别名声明 60
2.5.2 auto类型指示符 61
2.5.3 decltype类型指示符62
2.6.1 类内初始化 65
3.2.2 使用auto或decltype缩写类型 79
3.2.3 范围for语句 82
3.3 定义vector对象的vector(向量的向量) 87
3.3.1 vector对象的列表初始化88
3.4.1 容器的cbegin和cend函数 98
3.5.3 标准库begin和end函数 106
3.6 使用auto和decltype简化声明 115
4.2 除法的舍入规则125
4.4 用大括号包围的值列表赋值 129
4.9 将sizeof用于类成员 139
5.4.3 范围for语句 168
6.2.6 标准库initializer_list类 197
6.3.2 列表初始化返回值 203
6.3.3 定义尾置返回类型 206
6.3.3 使用decltype简化返回类型定义
6.5.2 constexpr函数 214
7.1.4 使用=default生成默认构造函数 237
7.3.1 类对象成员的类内初始化 246
7.5.2 委托构造函数 261
7.5.6 constexpr构造函数 268
8.2.1 用string对象处理文件名284
9.1 array和forward_list容器 293
9.2.3 容器的cbegin和cend函数 298
9.2.4 容器的列表初始化 300
9.2.5 容器的非成员函数swap 303
9.3.1 容器insert成员的返回类型 308
9.3.1 容器的emplace成员的返回类型 308
9.4 shrink_to_fit 318
9.5.5 string的数值转换函数 327
10.3.2 Lambda表达式 346
10.3.3 Lambda表达式中的尾置返回类型 353
10.3.4 标准库bind函数 354
11.2.1 关联容器的列表初始化 377
11.2.3 列表初始化pair的返回类型 380
11.3.2 pair的列表初始化 384
11.4 无序容器 394
12.1 智能指针 400
12.1.1 shared_ptr类
12.1.2 动态分配对象的列表初始化 407
12.1.2 auto和动态分配 408
12.1.5 unique_ptr类 417
12.1.6 weak_ptr类 420
12.2.1 范围for语句不能应用于动态分配数组 424
12.2.1 动态分配数组的列表初始化 424
12.2.1 auto不能用于分配数组 424
12.2.2 allocator::construct可以使用任意构造函数 428
13.1.5 将=default用于拷贝控制成员 449
13.1.6 使用=default阻止拷贝类对象 449
13.5 用移动类对象代替拷贝类对象 469
13.6.1 右值引用 471
13.6.1 标准库move函数 472
13.6.2 移动构造函数和移动赋值 473
13.6.2 移动构造函数一般应该是noexcept 473
13.6.2 移动迭代器 480
13.6.3 引用限定成员函数 483
14.8.3 function类模板 512
14.9.1 explicit类型转换运算符 516
15.2.2 虚函数的override指示符 530
15.2.2 经过定义类为final来阻止继承 533
15.3 虚函数的override和final指示符 538
15.7.2 删除的拷贝控制和继承 553
15.7.4 继承的构造函数 557
16.1.2 声明模板类型形参为友元 590
16.1.2 模板类型别名 590
16.1.3 模板函数的默认模板参数 594
16.1.5 实例化的显式控制 597
16.2.3 模板函数与尾置返回类型 605
16.2.5 引用折叠规则 609
16.2.6 用static_cast将左值转换为右值 612
16.2.7 标准库forward函数 614
16.4 可变参数模板 618
16.4 sizeof...运算符 619
16.4.3 可变参数模板与转发 622
17.1 标准库Tuple类模板636
17.2.2 新的bitset运算 643
17.3 正则表达式库 645
17.4 随机数库 659
17.5.1 浮点数格式控制 670
18.1.4 noexcept异常指示符 690
18.1.4 noexcept运算符 691
18.2.1 内联名字空间 699
18.3.1 继承的构造函数和多重继承 712
19.3 有做用域的enum 736
19.3 说明类型用于保存enum对象 738
19.3 enum的提早声明 738
19.4.3 标准库mem_fn类模板 746
19.6 类类型的联合成员 751
精彩节摘
推荐序
C++11标准公布以后,C++社群出现了久违的热情,有人甚至叫出“C++的复兴”。期望C++回到20世纪90年代中期那样的地位显然是昧于大势的奢望,可是C++经历了这么多年的打磨与起伏,其在工业界的地位已经很是稳固,在不少领域里已是不可取代也不必被取代的统治者。新标准的出现可以大大提高C++开发的效率和质量,所以赢得欢呼也是情理之中。在这种氛围之下,编译器实现的速度也使人惊喜。短短两年时间,从开源的GCC、LLVM到专有的Visual C++和Intel C++,对于新标准的追踪之快,覆盖之全,与当年C++ 98标准颁布以后迟迟不能落地的窘境相比,可谓对比强烈。当年是热情的开发者反复敦促厂商实现完整标准而不得,为此沮丧无奈,那种心情,至今记忆犹新。时过境迁,今天是编译器实现远远冲在前面,开发者却是大大地落在了后面。
时至今日,可以基本了解C++11标准的程序员恐怕很少,而可以以新的C++风格开发实践的人更是百里挑一。所以,今天的C++开发者面临的一个重要任务就是快速掌握新的C++风格和工具。
而说到教授“正宗的”C++11编程风格,《C++ Primer(第5版)》如同它以前的版本同样,扮演着法定教科书的角色。
一种优秀的编程语言,必定要对于计算这件事情实现一个完整和自洽的抽象。十几年来编程语言领域的竞争,除却实现质量以外,基本上是在比拼抽象的设计。而C语言之因此四十年长盛不衰,根本在于它对于现代计算机提供了一个最底层的高级抽象:凡是比它低的抽象都过于简陋,凡是比它高的抽象均可以用C语言构造出来。C++成功的根本缘由,偏偏是由于它虽然试图提供一些高级的抽象机制,可是其根基与C在同一层面。正由于如此,每当你须要走下去直接与硬件对话时,C++成为C以外惟一有效率的选择。个人一个朋友在进行了多年的大型系统软件开发以后,不无感慨地说,C++最大的力量不在于其抽象,偏偏在于其不抽象。
话虽然如此,可是C++之因此脱离C而存在,毕竟仍是由于其强大的抽象能力。Bjarne Stroustrup曾经总结说,C++同时支持4种不一样的编程风格:C风格、基于对象、面向对象和泛型。事实上,把微软的COM也算进来的话,还能够加上一种“基于组件”的风格。这么多的风格共存于一种语言,就是其强大抽象机制的证实。可是,在C++11之前,C++的抽象能够说存在若干缺陷,其中最严重的是缺乏自动内存管理和对象级别的消息发送机制。今天看来,C++ 98只能说是特定历史条件形成的半成品,不管是从语言机制,仍是标准库完备程度来讲,能够说都存在明显的、不容忽略的缺陷。其直接后果,就是优雅性的缺失和效率的下降。我本人在十年前曾经与当时中国C++社群中很多杰出的人物交流探讨,试图从C++ 98中剪裁出一个小巧、优雅的、自成一体的子集,但愿至少在平常编程中,可以在这个子集以内能够写出与当时的Java和C#一样干净明晰的代码。为此咱们尝试了各类古怪的模板技巧,而且处处寻找有启发的代码和经验来构造这个语言子集,结果并不理想,甚至能够说是使人很是失望。后来我在个人博客中发表过好几篇文章,探讨所谓的C++风格问题,其实就是说,C++不支持简洁明快的面向对象风格,你们还不如回到基于对象甚至C语言的风格,最多加点模板,省一点代码量。非要面向对象的话,就必须依赖像Qt或者MFC那样的基础设施才能够。
C++11出来以后,加强的语言机制和大为完善的标准库,为C++语言的编程风格带来了革命性的变化。若是可以纯熟地运用C++11的新特征、新机制,那么就可以造成一种简洁优雅的C++编 程风格,以比从前更高的效率、更好的质量进行软件开发。对于这种新的风格,我认为“直觉、天然”是最佳的描述。也就是说,解决任何问题没必要拘泥于什么笼盖 一切的编程思想,也再也不沉溺于各类古怪的模板技巧中没法自拔,而是可以根据那个问题自己采用最天然、最符合直觉的方式。C++有本身的一套思惟方式,好比容器、算法、做为概念抽象的对象等,很大程度上这套思惟方式确实是合乎直觉的。只有到了C++11这一代,C++语言的高级抽象才基本完备,这样一种风格才可能真正落实。所以能够说C++11对于C++ 98而言,不是一次简单的升级,而是一次本质的跃升。
学习新的C++风格,并非垂手可得的事情。即使对于之前已经精通C++的人来讲,熟练掌握rvalue reference、move语义,了解unique_ptr、shared_ptr和weak_ptr的完整用法,明智地使用function/bind和lambda机制,学习C++ Concurrency的新技术,都绝非一朝一夕之功。对于那些初学者来讲,这件事情更不简单。
本书不管对于初学者仍是提升者,都是最经典的教科全书。一直以来,它的特色就是完整而详细,基本上关于语言自己的问题,均可以在这本书里获得解决。而本书的另外一个重要优势,就是其彻底基于新的编程风格编写,全部的例子和讲解都遵循C++11标准所体现出来的思路和风格进行,若是可以踏下心来认真学习和练习,那么就能“一次到位”地掌握C++11,尽管可能会比较慢。有经验的C++开发者阅读这本书固然不用从头至尾,选择本身关心的内容学习C++11的新特性就能够,是快速升级自身能力的捷径。
差很少十年前,我提出一个观点,每个具体的技术领域,只须要读四五本书就够了。之前的C++是个例外,由于语言设计有缺陷,因此要读不少书才知道如何绕过缺陷。如今的C++11彻底能够了,你们读四五本书就能够达到合格的水平,这偏偏是语言进步的体现。
本书是这四五本中的一本,并且是“教程+参考书”,扛梁之做,初学者的不二法门。另外一本是《C++标准程序库(第2版)》,对于C++熟手来讲更为快捷。Scott Meyers的Effective C++永远是学习C++者必读的,只不过这本书的第4版不知道何时出来。Anthony Williams的C++ Concurrency in Action是学习用标准C++开发并发程序的最佳选择。国内的做品,我则高度推荐陈硕的《Linux多线程服务端编程》。这本书的名字赶跑了很多潜在的读者,因此我要特别说明一下。这本书是C++开发的高水平做品,与其说是教你怎么用C++写服务端开发,不如说是教你如何以服务端开发为例子提高C++开发水平。前面几本书都是谈标准C++本身的事情,碰到像iostream这样失败的标准组件也不得不硬着头皮介绍。而这本书是接地气的实践结晶,告诉你面对具体问题时应怎样权衡,C++里什么好用,什么很差用,为何,等等。
今天的C++学习者是很是幸运的,能够在C++11这个基础上大步向前,没必要再由于那些语言的缺陷和过分的技巧而烦恼。你们静下心来认真读几本书,能够打下很好的基础。
孟岩
2013年8月 北京
做者简介
Stanley B. Lippman目前是微软公司 Visual C++ 团队的架构师。他从1984年开始在贝尔实验室与C++的设计者Bjarne Stroustrup一块儿从事C++的设计与开发。他在迪士尼和梦工厂从事动画制做,还担任过JPL的高级顾问。
Josée Lajoie曾经是IBM加拿大研究中心C/C++编译器开发团队的成员,在ISO C++标准委员会工做了7年,担任过ISO核心语言工做组的主席和C++ Report杂志的专栏做家。
Barbara E. Moo是拥有25年软件经验的独立咨询顾问。在AT&T,她与Stroustrup、Lippman一块儿管理过复杂的C++开发项目。
媒体评论
这本CP5彻底能够当作参考书或者字典来用,在语法上遇到什么问题或者编译有问题均可以再这本书里找答案,CP4是很是权威的,毕竟Lippman大大是第一个C++编译器的实现者之一。
这本书的写做方式实在适合国人。他没有中国做家广泛的“讲概念”式的写做手法,而是从因到果,由浅入深,由表及里娓娓道来,从语言的简单用法,到为何这样设计语言,你不只能从一个语言使用者的角度看问题,更能站在一个语言设计者的角度思考这种语言的设计优劣。
这是本很是经典的C++书籍,系统全面地介绍了C++语言。本书近一千页,能够当作是学习C++的百科全书。市面上没有哪本其余书籍比本书论述得更普遍,几乎全部的C++知识点本书都有论述并且写得还不错。由于这点,这本书值得每一位C++程序员拥有。
针对C++11而新添加到书中的内容恰到好处地定义了这个新版本。做者在新版本中给出了清晰的阐述,如自动类型、decltype、列表初始化器、右值引用、move操做符、lambda表达式、智能指针等。仅针对C++11的延展,正是这本书的价值所在。
C++是一门强大、难学、使人痛苦,但又是如此美妙的编程语言,在工业界和学术界均可以使用,《C++ Primer(第5版)》即针对初学者,也一样适用于有必定编程经验的读者,最新版本配备了C++11最新标准,是C++粉丝们书架上必备的一本经典著做。
前言
难以计数的程序员已经经过旧版的《C++ Primer》学会了C++语言。而在这段时间中,C++自己又已成熟了许多:语言自己的关注点和程序设计社区的关注点都已大大开阔,已经从主要关注机器效率转变为更多地关注编程效率。
2011年,C++标准委员会发布了ISO C++标准的一个重要修订版。此修订版是C++进化过程当中的最新一步,延续了前几个版本对编程效率的强调。新标准的主要目标是:
所以,在这个版本的《C++ Primer》中,咱们进行了完全的修改,使用了最新的C++标准,即C++11。为了了解新标准是如何全面影响C++语言的,你能够看一下xxiii页至xxv页的新特性列表,其中列出了哪些章节涉及了C++的新特性。
新标准增长的一些特性是具备普适性的,例如用于类型推断的auto。 这些新特性使本书中的代码更易于阅读和理解。程序(以及程序员!)能够忽略类型的细节,从而更容易集中精力于程序逻辑上来。其余一些新特性,例如智能指针 和容许移动的容器,容许咱们编写更为复杂的类,而又没必要与错综复杂的资源管理作斗争。所以,在本书中开始讲授如何编写本身的类,会比第4版简单得多。旧标准中阻挡在咱们前进路上的不少细节,你我都没必要再担忧了。
对于本书中涉及新标准定义的新特性的那些部分,咱们都已用一个特殊的图标标记出来了。咱们但愿这些提示标记对那些已经熟悉C++语言核心内容的读者是有帮助的,能够帮助他们决定将注意力投向哪里。对于那些可能尚不支持全部新特性的编译器,咱们还但愿这些图标能有助于解释这类编译器所给出的编译错误信息。这是由于虽然本书中几乎全部例子都已经用最新版本的GNU编译器编译经过,但咱们知道一些读者可能还没有将编译器更新到最新版本。虽然新标准增长了大量新功能,但核心C++语言并未变化,这构成了本书的大部份内容。读者能够借助这些图标来判断哪些功能可能尚未被本身的编译器所支持。
为何选择这本书?
现代C++语言能够看做是三部分组成的:
大多数C++教材按照语言进化的顺序来组织其内容。首先讲授C++的C子集,而后将C++的更为抽象的一些特性做为高级话题在书的最后进行介绍。这种方式存在两个问题:读者会陷入那些继承自低级程序设计的细节,从而因为挫折感而放弃;读者被强加学习一些坏习惯,随后又须要忘记这些内容。
咱们采用一种相反的方法:从一开始就介绍一些语言特性,能让程序员忽略那些继承自低级程序设计的细节。例如,在介绍和使用内置的算术和数组类型时,咱们还连同介绍和使用标准库中的类型string和vector。使用这些类型的程序更易写、易理解且更少出错。
太多时候,标准库被看成一种“高级”话题来说授。不少教材不使用标准库,而是使用基于字符数组指针和动态内存管理的低级程序设计技术。让使用这种低级技术的程序正确运行,要比编写相应的使用标准库的C++代码困可贵多。
贯穿全书,咱们都在强调好的风格:咱们想帮助读者直接养成好的习惯,而不是在得到不少很复杂的知识后再去忘掉那些坏习惯。咱们特别强调那些棘手的问题,并对常见的错误想法和陷阱提出警告。
咱们还注意解释规则背后的基本原理——使读者不只知其然,还能知其因此然。咱们相信,经过体会程序的工做原理,读者会更快地巩固对语言的理解。
虽然你没必要为了学习本书而掌握C语言,但咱们仍是假定你了解足够多的程序设计知识,了解至少一门现代分程序结构语言,知道如何用这门语言编写、编译以及运行程序。特别是,咱们假定你已经使用过变量,编写、调用过函数,也使用过编译器。
第5版变化的内容
这一版《C++ Primer》的新特色是用边栏图标来帮助引导读者。C++是 一种庞大的编程语言,它提供了一些为特定程序设计问题定制的功能。其中一些功能对大型项目团队有很重要的意义,但对于小型项目开发可能并没有必要。所以,并 非每一个程序员都须要了解每一个语言特性的全部细节。咱们加入这些边栏图标来帮助读者弄清哪些内容能够随后再学习,而哪些主题是更为重要的。
对于包含C++语言基础内容的章节,咱们用一个小人正在读书的图标加以标记。用这个图标标记的那些章节,涵盖了构成语言核心部分的主题。每一个人都应该阅读并理解这些章节的内容。
对 于那些涉及高级主题或特殊目的主题的章节,咱们也进行了标记。在首次阅读时,这些章节能够跳过或快速浏览。咱们用一叠书的图标标记这些章节,指出在这些地 方,你能够放心地放下书本。快速浏览这些章节多是一个好主意,这样你就能够知道有这些特性存在。但在真正须要在本身的程序中使用这些特性以前,没有必要 花费时间仔细学习这些主题。
为了进一步引导读者的注意力,咱们还用放大镜图标标记了特别复杂的概念。咱们但愿读者对有这种标记的章节能多花费一些时间完全理解其中的内容。在这些章节中,至少有一些,其主题的重要性可能不是那么明显;但咱们认为,你会发现这些章节涉及的主题对理解C++语言原来相当重要。
交叉引用的普遍使用,是本书采用的另一种阅读帮助。咱们但愿这些引用能帮助读者容易地翻阅书中的内容,同时还能在后面的例子涉及到前面的内容时容易地跳回到前面。
没有改变的是,《C++ Primer》还是一本清晰、正确、全面的C++入门教材。咱们经过给出一系列复杂度逐步增长的例子来说授这门语言,这些例子说明了语言特性,展现了如何充分用好C++语言。
本书的结构
咱们首先在第I部分和第II部分中介绍了C++语言和标准库的基础内容。这两部分包含的内容足够你编写出有意义的程序,而不是只能写一些玩具程序。大部分程序员基本上都须要掌握本书这两部分所包含的全部内容。
除了讲授C++的基础内容,第I部分和第II部分还有另一个重要目的:经过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。标准库设施自己是一组抽象数据类型,一般用C++编写。用来设计标准库的,就是任何C++程序员均可以使用的用来构造类的那些语言特性。咱们讲授C++语言的一个经验是,在先学习了使用设计良好的抽象类型后,读者会发现理解如何构造本身的类型更容易了。
只有在通过全面的标准库使用训练,并编写了各类标准库所支持的抽象程序后,咱们才真正进入到那些容许你编写本身的抽象类型的C++特性中去。本书的第III部分和第IV部分介绍了如何编写类的形式的抽象类型。第III部分包含基础内容,第IV部分介绍更专门的语言特性。
在第III部分中,咱们将介绍拷贝控制问题,以及其余一些使类能像内置类型同样容易使用的技术。类是面向对象编程和泛型编程的基础,第III部分也会介绍这些内容。第IV部分是《C++ Primer》的结束部分,它介绍了一些在组织大型复杂系统时很是有用的语言特性。此外,咱们将在附录A中总结标准库算法。
读者帮助
本书的每一章均以一个总结和一个术语表结束,二者一块儿扼要回顾了这一章的大部分学习重点。读者应该将这些部分做为我的备忘录:若是你不理解某个术语,能够从新学习这一章的相应部分。
在本书中咱们还使用了其余一些学习辅助:
关于编译器的注意事项
在撰写本书时(2012年7月),编译器提供商正在努力工做,升级编译器以匹配最新的ISO标准。咱们使用最多的编译器是GNU编译器4.7.0。本书中只有一小部分特性在此编译器中还没有实现:继承构造函数、成员函数的引用限定符以及正则表达式库。
致谢
咱们要特别感谢标准委员会几位现任和前任委员:Dave Abrahams、Andy Koenig、Stephan T. Lavavej、Jason Merrill、John Spicer和Herb Sutter在准备本书的过程当中提供的帮助。在理解新标准的一些更微妙之处,他们为咱们提供了宝贵的帮助。咱们还要感谢不少致力于升级GNU编译器以实现新标准的人们。
与旧版《C++ Primer》中同样,咱们要感谢Bjarne Stroustrup不知疲倦地为C++工做以及他和做者长时间的友谊。咱们还要感谢Alex Stepanov的非凡洞察力,催生了标准库核心的容器和算法。最后,咱们要感谢C++标准委员会的全部委员,感谢他们这么多年来在净化、精炼和改进C++语言方面的辛苦工做。
咱们衷心感谢审稿人:Marshall Clow、Jon Kalb、Nevin Liber、Dr. C. L. Tondo、Daveed Vandevoorde和Steve Vinoski,他们建设性的意见帮助咱们对全书作出了大大小小的改进。
本书是用Latex及其发行版本中的不少包来进行排版的,咱们应该感谢Latex社区成员创造出如此强大的排版工具。
最后,咱们要感谢Addison-Wesley公司的优秀员工,他们指导了本书的整个出版过程:Peter Gordon,咱们的编辑,他给了咱们动力再次修改C++ Primer;Kim Boedigheimer,保证了一切按计划进行;Barbara Wood,她在编辑过程当中找到了大量编辑错误;还有Elizabeth Ryan,很高兴再次和她共同工做,她指导咱们完成了整个设计和生产流程。