编辑推荐
适读人群:《21天学通C++ 第8版》可作为初学者学习C++编程技术的教程,也可供已掌握其他语言的程序员学习C++时参考。
通过阅读《21天学通C++ 第8版》,读者可快速掌握C++的基本知识并学习其中更高级的功能和概念。《21天学通C++ 第8版》根据C++14标准进行了全面修订,展望了C++17,并从实用的角度诠释C++语言,帮助读者学习如何使用它创建速度更快、更简洁、更高效的C++应用程序。 掌握C++和面向对象编程的基本知识。 理解如何使用lambda表达式、移动构造函数和赋值运算符等C++功能编写简洁、高效的代码。 学习C++编程的实践并避开常见的陷阱。 学习标准模板库,包括大多数真实C++应用程序都要用到的容器和算法。 使用每章末尾的练习来检验对知识的掌握程度。 《21天学通C++ 第8版》特色: 无需任何编程经验; 编写速度更快、功能更强大的C++程序,编译源代码并创建可执行文件; 学习封装、抽象、继承和多态等面向对象编程概念; 使用标准模板库中的算法和容器编写功能丰富而稳定的C++应用程序; 学习自动类型推断是如何帮助简化C++代码的; 使用lambda表达式、智能指针和移动构造函数完成复杂的编程工作; 通过向编程专家学习,掌握C++功能; 学习能够用来编写出简洁且高性能应用程序的C++功能; 展望C++17有望引入的新功能。 读者可通过www.epubit.com.cn/book/details/4780下载《21天学通C++ 第8版》源代码。内容简介
《21天学通C++(第8版)》通过大量短小精悍的程序详细而全面地阐述了C++基本概念和技术,以及C++11、C++14和C++17新增的功能,包括管理输入/输出、循环和数组、面向对象编程、模板、使用标准模板库、列表初始化、lambda表达式、自动类型推断等。这些内容被组织成结构合理、联系紧密的章节,每章都可在1小时内阅读完毕;每章都提供了示例程序清单,并辅以示例输出和代码分析,以阐述该章介绍的主题。为加深读者对所学内容的理解,每章末尾都提供了常见问题及其答案以及练习和测验。读者可对照附录E提供的测验和练习答案,了解自己对所学内容的掌握程度。 《21天学通C++(第8版)》是针对C++初学者编写的,不要求读者有C语言方面的背景知识,可作为高等院校教授C++课程的教材,也可供初学者自学C++时使用。作者简介
SiddharthaRao是全球领先的企业软件提供商SAPSE负责安全响应的副总裁。C++的发展让他深信,您能编写速度更快、更简洁、更强大的C++应用程序。Siddhartha酷爱旅游,还是山地自行车运动的狂热爱好者;他期待着您对《21天学通C++ 第8版》的反馈。目录
第1章 绪论1
1.1C++简史1
1.1.1与C语言的关系1
1.1.2C++的优点1
1.1.3C++标准的发展历程2
1.1.4哪些人使用C++程序2
1.2编写C++应用程序2
1.2.1生成可执行文件的步骤2
1.2.2分析并修复错误2
1.2.3集成开发环境3
1.2.4编写第一个C++应用程序3
1.2.5生成并执行第一个C++应用程序4
1.2.6理解编译错误5
1.3C++新增的功能5
1.4总结5
1.5问与答6
1.6作业6
1.6.1测验6
1.6.2练习6
第2章 C++程序的组成部分8
2.1HelloWorld程序的组成部分8
2.1.1预处理器编译指令#include9
2.1.2程序的主体—main()9
2.1.3返回值10
2.2名称空间的概念10
2.3C++代码中的注释11
2.4C++函数12
2.5使用std::cin和std::cout执行基本输入
输出操作14
2.6总结15
2.7问与答15
2.8作业15
2.8.1测验16
2.8.2练习16
第3章 使用变量和常量17
3.1什么是变量17
3.1.1内存和寻址概述17
3.1.2声明变量以访问和使用内存17
3.1.3声明并初始化多个类型相同的
变量19
3.1.4理解变量的作用域19
3.1.5全局变量20
3.1.6命名约定22
3.2编译器支持的常见C++变量类型22
3.2.1使用bool变量存储布尔值23
3.2.2使用char变量存储字符23
3.2.3有符号整数和无符号整数的
概念24
3.2.4有符号整型short、int、long和
longlong24
3.2.5无符号整型unsignedshort、unsignedint、unsignedlong和unsignedlonglong25
3.2.6选择正确的数据类型以免发生
溢出错误25
3.2.7浮点类型float和double26
3.3使用sizeof确定变量的长度26
3.4使用auto自动推断类型28
3.5使用typedef替换变量类型29
3.6什么是常量30
3.6.1字面常量30
3.6.2使用const将变量声明为常量30
3.6.3使用constexpr定义常量表达式31
3.6.4枚举32
3.6.5使用#define定义常量34
3.7不能用作常量或变量名的关键字34
3.8总结35
3.9问与答36
3.10作业37
3.10.1测验37
3.10.2练习37
第4章 管理数组和字符串38
4.1什么是数组38
4.1.1为何需要数组38
4.1.2声明和初始化静态数组39
4.1.3数组中的数据是如何存储的39
4.1.4访问存储在数组中的数据40
4.1.5修改存储在数组中的数据41
4.2多维数组43
4.2.1声明和初始化多维数组44
4.2.2访问多维数组中的元素44
4.3动态数组45
4.4C风格字符串46
4.5C++字符串:使用std::string48
4.6总结50
4.7问与答50
4.8作业50
4.8.1测验51
4.8.2练习51
第5章 使用表达式、语句和运算符52
5.1语句52
5.2复合语句(语句块)53
5.3使用运算符53
5.3.1赋值运算符(=)53
5.3.2理解左值和右值53
5.3.3加法运算符(+)、减法运算符()、乘法运算符(*)、除法运算符(/)和求模运算符(%)53
5.3.4递增运算符(++)和递减运算符
()54
5.3.5前缀还是后缀55
5.3.6相等运算符(==)和不等运算符
(!=)56
5.3.7关系运算符56
5.3.8逻辑运算NOT、AND、OR和
XOR58
5.3.9使用C++逻辑运算NOT(!)、AND(&&)和OR(||)59
5.3.10按位运算符NOT(~)、AND(&)、OR(|)和XOR(^)63
5.3.11按位右移运算符(>>)和左移
运算符()238
12.3双目运算符239
12.3.1双目运算符的类型240
12.3.2双目加法与双目减法运算符240
12.3.3实现运算符+=与=242
12.3.4重载等于运算符(==)和不等运算
符(!=)243
12.3.5重载运算符、=245
12.3.6重载复制赋值运算符(=)248
12.3.7下标运算符250
12.4函数运算符operator()253
12.5用于高性能编程的移动构造函数和
移动赋值运算符254
12.5.1 不必要的复制带来的问题254
12.5.2 声明移动构造函数和移动赋值
运算符254
12.6用户定义的字面量258
12.7不能重载的运算符260
12.8总结261
12.9问与答261
12.10作业261
12.10.1测验261
12.10.2练习261
第13章 类型转换运算符262
13.1为何需要类型转换262
13.2为何有些C++程序员不喜欢C风格
类型转换263
13.3C++类型转换运算符263
13.3.1使用static_cast263
13.3.2使用dynamic_cast和运行阶段
类型识别264
13.3.3使用reinterpret_cast267
13.3.4使用const_cast267
13.4C++类型转换运算符存在的问题268
13.5总结269
13.6问与答269
13.7作业270
13.7.1测验270
13.7.2练习270
第14章 宏和模板简介271
14.1预处理器与编译器271
14.2使用#define定义常量271
14.3使用#define编写宏函数274
14.3.1为什么要使用括号276
14.3.2使用assert宏验证表达式276
14.3.3使用宏函数的优点和缺点277
14.4模板简介278
14.4.1模板声明语法278
14.4.2各种类型的模板声明279
14.4.3模板函数279
14.4.4模板与类型安全281
14.4.5模板类281
14.4.6声明包含多个参数的模板282
14.4.7声明包含默认参数的模板283
14.4.8一个模板示例283
14.4.9模板的实例化和具体化284
14.4.10模板类和静态成员286
14.4.11参数数量可变的模板287
14.4.12使用static_assert执行编译阶段
检查290
14.4.13在实际C++编程中使用模板290
14.5总结291
14.6问与答291
14.7作业291
14.7.1测验291
14.7.2练习292
第15章 标准模板库简介293
15.1STL容器293
15.1.1顺序容器293
15.1.2关联容器294
15.1.3容器适配器294
15.2STL迭代器295
15.3STL算法295
15.4使用迭代器在容器和算法之间交互295
15.5选择正确的容器297
15.6STL字符串类298
15.7总结298
15.8问与答299
15.9作业299
第16章 STLstring类300
16.1为何需要字符串操作类300
16.2使用STLstring类301
16.2.1实例化和复制STLstring301
16.2.2访问std::string的字符内容303
16.2.3拼接字符串305
16.2.4在string中查找字符或
子字符串306
16.2.5截短STLstring307
16.2.6字符串反转309
16.2.7字符串的大小写转换310
16.3基于模板的STLstring实现311
16.4总结312
16.5问与答312
16.6作业313
16.6.1测验313
16.6.2练习313
第17章 STL动态数组类314
17.1std::vector的特点314
17.2典型的vector操作314
17.2.1实例化vector314
17.2.2使用push_back()在末尾插入
元素316
17.2.3列表初始化317
17.2.4使用insert()在指定位置插入
元素317
17.2.5使用数组语法访问vector中的
元素319
17.2.6使用指针语法访问vector中的
元素320
17.2.7删除vector中的元素321
17.3理解大小和容量322
17.4STLdeque类324
17.5总结326
17.6问与答326
17.7作业327
17.7.1测验327
17.7.2练习327
第18章 STLlist和forward_list328
18.1std::list的特点328
18.2基本的list操作328
18.2.1实例化std::list对象328
18.2.2在list开头或末尾插入元素330
18.2.3在list中间插入元素331
18.2.4删除list中的元素333
18.3对list中的元素进行反转和排序334
18.3.1使用list::reverse()反转元素的
排列顺序334
18.3.2对元素进行排序335
18.3.3对包含对象的list进行排序以及
删除其中的元素337
18.3.4C++11引入的std::forward_list340
18.4总结341
18.5问与答342
18.6作业342
18.6.1测验342
18.6.2练习342
第19章 STL集合类343
19.1简介343
19.2STLset和multiset的基本操作344
19.2.1实例化std::set对象344
19.2.2在set或multiset中插入元素345
19.2.3在STLset或multiset中查找
元素347
19.2.4删除STLset或multiset中的
元素348
19.3使用STLset和multiset的优缺点352
19.4总结354
19.5问与答355
19.6作业355
19.6.1测验355
19.6.2练习355
第20章 STL映射类356
20.1STL映射类简介356
20.2STLmap和multimap的基本操作357
20.2.1实例化std::map和
std::multimap357
20.2.2在STLmap或multimap中插入
元素358
20.2.3在STLmap或multimap中查找
元素361
20.2.4在STLmultimap中查找元素363
20.2.5删除STLmap或multimap中的
元素363
20.3提供自定义的排序谓词365
20.4基于散列表的STL键-值对容器368
20.4.1散列表的工作原理368
20.4.2使用unordered_map和unordered_
multimap368
20.5总结372
20.6问与答372
20.7作业372
20.7.1测验373
20.7.2练习373
第21章 理解函数对象374
21.1函数对象与谓词的概念374
21.2函数对象的典型用途374
21.2.1一元函数374
21.2.2一元谓词378
21.2.3二元函数380
21.2.4二元谓词381
21.3总结383
21.4问与答384
21.5作业384
21.5.1测验384
21.5.2练习384
第22章 lambda表达式385
22.1lambda表达式是什么385
22.2如何定义lambda表达式386
22.3一元函数对应的lambda表达式386
22.4一元谓词对应的lambda表达式387
22.5通过捕获列表接受状态变量的lambda
表达式388
22.6lambda表达式的通用语法390
22.7二元函数对应的lambda表达式391
22.8二元谓词对应的lambda表达式392
22.9总结394
22.10问与答394
22.11作业395
22.11.1测验395
22.11.2练习395
第23章 STL算法396
23.1什么是STL算法396
23.2STL算法的分类396
23.2.1非变序算法396
23.2.2变序算法397
23.3使用STL算法398
23.3.1根据值或条件查找元素398
23.3.2计算包含给定值或满足给定条件的
元素数400
23.3.3在集合中搜索元素或序列401
23.3.4将容器中的元素初始化为
指定值403
23.3.5使用std::generate()将元素设置为
运行阶段生成的值405
23.3.6使用for_each()处理指定范围内的
元素406
23.3.7使用std::transform()对范围进行
变换407
23.3.8复制和删除操作409
23.3.9替换值以及替换满足给定条件的
元素412
23.3.10排序、在有序集合中搜索以及删除
重复元素413
23.3.11将范围分区415
23.3.12在有序集合中插入元素417
23.4总结419
23.5问与答419
23.6作业419
23.6.1测验420
23.6.2练习420
第24章 自适应容器:栈和队列421
24.1栈和队列的行为特征421
24.1.1栈421
24.1.2队列422
24.2使用STLstack类422
24.2.1实例化stack422
24.2.2stack的成员函数423
24.2.3使用push()和pop()在栈顶插入和
删除元素424
24.3使用STLqueue类425
24.3.1实例化queue425
24.3.2queue的成员函数426
24.3.3使用push()在队尾插入以及使用
pop()从队首删除427
24.4使用STL优先级队列428
24.4.1实例化priority_queue类428
24.4.2priority_queue的成员
函数429
24.4.3使用push()在priority_queue末尾
插入以及使用pop()在priority_queue
开头删除430
24.5总结432
24.6问与答432
24.7作业432
24.7.1测验432
24.7.2练习432
第25章 使用STL位标志433
25.1bitset类433
25.2使用std::bitset及其成员434
25.2.1std:bitset的运算符434
25.2.2std::bitset的成员方法435
25.3vector437
25.3.1实例化vector437
25.3.2vector的成员函数和
运算符438
25.4总结439
25.5问与答439
25.6作业439
25.6.1测验439
25.6.2练习440
第26章 理解智能指针441
26.1什么是智能指针441
26.1.1常规(原始)指针存在的
问题441
26.1.2智能指针有何帮助442
26.2智能指针是如何实现的442
26.3智能指针类型443
26.3.1深复制443
26.3.2写时复制机制445
26.3.3引用计数智能指针445
26.3.4引用链接智能指针445
26.3.5破坏性复制445
26.3.6使用std::unique_ptr447
26.4深受欢迎的智能指针库449
26.5总结449
26.6问与答449
26.7作业450
26.7.1测试450
26.7.2练习450
第27章 使用流进行输入和输出451
27.1流的概述451
27.2重要的C++流类和流
对象452
27.3使用std::cout将指定格式的数据
写入控制台453
27.3.1使用std::cout修改数字的显示
格式453
27.3.2使用std::cout对齐文本和设置
字段宽度455
27.4使用std::cin进行输入455
27.4.1使用std::cin将输入读取到基本
类型变量中455
27.4.2使用std::cin:get将输入读取到char*
缓冲区中456
27.4.3使用std::cin将输入读取到
std::string中457
27.5使用std::fstream处理文件458
27.5.1使用open()和close()打开和关闭
文件459
27.5.2使用open()创建文本文件并使用
运算符读取文本
文件460
27.5.4读写二进制文件461
27.6使用std::stringstream对字符串进行
转换463
27.7总结464
27.8问与答464
27.9作业465
27.9.1测验465
27.9.2练习465
第28章 异常处理466
28.1什么是异常466
28.2导致异常的原因466
28.3使用try和catch捕获异常467
28.3.1使用catch(…)处理所有
异常467
28.3.2捕获特定类型的异常468
28.3.3使用throw引发特定类型的
异常469
28.4异常处理的工作原理470
28.4.1std::exception类472
28.4.2从std::exception派生出自定义
异常类473
28.5总结474
28.6问与答474
28.7作业475
28.7.1测验475
28.7.2练习475
第29章 继续前行477
29.1当今的处理器有何不同477
29.2如何更好地利用多个内核478
29.2.1线程是什么478
29.2.2为何要编写多线程应用
程序479
29.2.3线程如何交换数据479
29.2.4使用互斥量和信号量同步
线程480
29.2.5多线程技术带来的问题480
29.3编写杰出的C++代码480
29.4C++17有望引入的新特性481
29.4.1支持在if和switch中进行
初始化481
29.4.2保证复制得以避免482
29.4.3避免内存分配开销的
std::string_view482
29.4.4类型安全的共用体替代品
std::variant483
29.4.5使用ifconstexpr有条件地编译
代码483
29.4.6改进的lambda表达式484
29.4.7在构造函数中使用类型自动推断
功能484
29.5更深入地学习C++484
29.5.1在线文档485
29.5.2提供指南和帮助的社区485
29.6总结485
29.7问与答485
29.8作业485
附录A 二进制和十六进制486
A.1十进制486
A.2二进制486
A.2.1计算机为何使用二进制487
A.2.2位和字节487
A.2.31KB相当于多少字节487
A.3十六进制487
A.4不同进制之间的转换488
A.4.1通用转换步骤488
A.4.2从十进制转换为二进制488
A.4.3从十进制转换为十六进制489
附录B C++关键字490
附录C 运算符优先级491
附录D ASCII码492
附录E 答案495