图书介绍

C++高级编程2025|PDF|Epub|mobi|kindle电子书版本百度云盘下载

C++高级编程
  • (美)葛瑞格尔著 著
  • 出版社: 北京:清华大学出版社
  • ISBN:9787302396970
  • 出版时间:2015
  • 标注页数:782页
  • 文件大小:105MB
  • 文件页数:803页
  • 主题词:C语言-程序设计

PDF下载


点此进入-本书在线PDF格式电子书下载【推荐-云解压-方便快捷】直接下载PDF格式图书。移动端-PC端通用
种子下载[BT下载速度快]温馨提示:(请使用BT下载软件FDM进行下载)软件下载地址页直链下载[便捷但速度慢]  [在线试读本书]   [在线获取解压码]

下载说明

C++高级编程PDF格式电子书版下载

下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。

建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!

(文件页数 要大于 标注页数,上中下等多册电子书除外)

注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具

图书目录

第Ⅰ部分 专业的C++简介3

第1章 C++和STL速成3

1.1 C++基础知识3

1.1.1 小程序“hello world”4

1.1.2 名称空间6

1.1.3 变量8

1.1.4 字面量9

1.1.5 运算符9

1.1.6 类型11

1.1.7 条件13

1.1.8 数组16

1.1.9 循环18

1.1.10 函数19

1.1.11 类型推断(上)21

1.1.12 这些都是基础21

1.2 深入研究C++21

1.2.1 指针和动态内存22

1.2.2 引用26

1.2.3 C++中的字符串26

1.2.4 异常27

1.2.5 const的多种用法28

1.2.6 类型推断(下)29

1.3 作为面向对象语言的C++30

1.4 标准库32

1.5 第一个有用的C++程序33

1.5.1 雇员记录系统33

1.5.2 Employee类33

1.5.3 Database类36

1.5.4 用户界面39

1.5.5 评估程序41

1.6 本章小结41

第2章 使用字符串43

2.1 动态字符串43

2.1.1 C风格的字符串43

2.1.2 字符串字面量45

2.1.3 C++string类46

2.1.4 原始字符串字面量49

2.1.5 非标准字符串50

2.2 本章小结50

第3章 编码风格51

3.1 良好外观的重要性51

3.1.1 事先考虑51

3.1.2 良好风格的元素52

3.2 为代码编写文档52

3.2.1 使用注释的原因52

3.2.2 注释的风格55

3.2.3 本书的注释59

3.3 分解59

3.3.1 通过重构分解59

3.3.2 通过设计分解60

3.3.3 本书中的分解60

3.4 命名60

3.4.1 选择恰当的名称60

3.4.2 命名约定61

3.5 使用具有风格的语言特性63

3.5.1 使用常量63

3.5.2 使用引用代替指针63

3.5.3 使用自定义异常64

3.6 格式64

3.6.1 关于大括号对齐的争论64

3.6.2 关于空格和圆括号的争论65

3.6.3 空格和制表符66

3.7 风格的挑战66

3.8 本章小结66

第Ⅱ部分 专业的C++软件设计69

第4章 设计专业的C++程序69

4.1 程序设计概述69

4.2 程序设计的重要性70

4.3 C++设计的特点72

4.4 C++设计的两个原则73

4.4.1 抽象73

4.4.2 重用74

4.5 重用代码75

4.5.1 关于术语的说明76

4.5.2 决定是否重用代码76

4.5.3 重用代码的策略78

4.5.4 绑定第三方应用程序82

4.5.5 开放源代码库82

4.5.6 C++标准库83

4.6 设计模式和技巧84

4.7 设计一个国际象棋程序84

4.7.1 需求84

4.7.2 设计步骤85

4.8 本章小结88

第5章 面向对象设计91

5.1 过程化的思考方式91

5.2 面向对象思想92

5.2.1 类92

5.2.2 组件92

5.2.3 属性93

5.2.4 行为93

5.2.5 综合考虑93

5.3 生活在对象世界里94

5.5.1 过度使用对象94

5.5.2 过于通用的对象95

5.4 对象之间的关系96

5.4.1 “有一个”关系96

5.4.2 “是一个”关系(继承)97

5.4.3 “有一个”与“是一个”的区别98

5.4.4 Not-a关系101

5.4.5 层次结构101

5.4.6 多重继承102

5.4.7 混入类103

5.5 抽象104

5.5.1 接口与实现104

5.5.2 决定公开的接口104

5.5.3 设计成功的抽象106

5.6 本章小结106

第6章 设计可重用代码107

6.1 重用哲学107

6.2 如何设计可重用的代码108

6.2.1 使用抽象108

6.2.2 构建理想的重用代码109

6.2.3 设计有用的接口113

6.2.4 协调通用性和使用性116

6.3 本章小结117

第Ⅲ部分 专业的C++编码方法121

第7章 熟悉类和对象121

7.1 电子表格示例介绍121

7.2 编写类122

7.2.1 类定义122

7.2.2 定义方法124

7.2.3 使用对象127

7.3 对象的生命周期129

7.3.1 创建对象129

7.3.2 销毁对象143

7.3.3 对象赋值144

7.3.4 复制和赋值的区别147

7.4 本章小结148

第8章 掌握类与对象149

8.1 对象的动态内存分配149

8.1.1 Spreadsheet类149

8.1.2 使用析构函数释放内存151

8.1.3 处理复制和赋值152

8.2 不同的数据成员类型158

8.2.1 静态数据成员158

8.2.2 常量数据成员159

8.2.3 引用数据成员160

8.2.4 常量引用数据成员161

8.3 与方法有关的更多内容162

8.3.1 静态方法162

8.3.2 const方法162

8.3.3 方法重载164

8.3.4 默认参数165

8.3.5 内联方法166

8.4 嵌套类167

8.5 类内的枚举类型168

8.6 友元169

8.7 运算符重载170

8.7.1 示例:为SpreadsheetCell实现加法170

8.7.2 重载算术运算符174

8.7.3 重载比较运算符176

8.7.4 创建具有运算符重载的类型178

8.8 创建稳定的接口178

8.9 本章小结181

第9章 揭秘继承技术183

9.1 使用继承构建类183

9.1.1 扩展类184

9.1.2 重写方法187

9.2 使用继承重用代码190

9.2.1 WeatherPrediction类190

9.2.2 在派生类中添加功能191

9.2.3 在派生类中替换功能192

9.3 利用父类193

9.3.1 父类构造函数193

9.3.2 父类的析构函数194

9.3.3 使用父类方法196

9.3.4 向上转型和向下转型198

9.4 继承与多态性199

9.4.1 回到电子表格199

9.4.2 设计多态性的电子表格单元格200

9.4.3 电子表格单元格的基类200

9.4.4 独立的派生类202

9.4.5 利用多态性204

9.4.6 考虑将来205

9.5 多重继承206

9.5.1 从多个类继承206

9.5.2 名称冲突和歧义基类207

9.6 有趣而晦涩的继承问题210

9.6.1 修改重写方法的特征210

9.6.2 继承的构造函数214

9.6.3 重写方法时的特殊情况217

9.6.4 派生类中的复制构造函数和赋值运算符223

9.6.5 virtual的真相224

9.6.6 运行时类型工具227

9.6.7 非public继承228

9.6.8 虚基类228

9.7 本章小结229

第10章 理解灵活而奇特的C++231

10.1 引用231

10.1.1 引用变量232

10.1.2 引用数据成员233

10.1.3 引用参数234

10.1.4 引用作为返回值235

10.1.5 使用引用还是指针235

10.1.6 右值引用238

10.2 关键字的疑问242

10.2.1 const关键字243

10.2.2 static关键字246

10.2.3 非局部变量的初始化顺序249

10.2.4 非局部变量的销毁顺序249

10.3 类型和类型转换250

10.3.1 typedef250

10.3.2 函数指针typedef251

10.3.3 类型别名251

10.3.4 类型转换252

10.4 作用域解析256

10.5 C++11/C++14257

10.5.1 统一初始化257

10.5.2 初始化列表258

10.5.3 显式转换运算符259

10.5.4 特性260

10.5.5 用户定义的字面量260

10.6 头文件262

10.7 C的实用工具263

10.7.1 变长参数列表263

10.7.2 预处理器宏265

10.8 本章小结266

第11章 利用模板编写泛型代码267

11.1 模板概述268

11.2 类模板268

11.2.1 编写类模板268

11.2.2 尖括号275

11.2.3 编译器处理模板的原理275

11.2.4 将模板代码分布在多个文件中276

11.2.5 模板参数278

11.2.6 方法模板280

11.2.7 模板类特例化284

11.2.8 从类模板派生286

11.2.9 继承还是特例化287

11.2.10 模板别名287

11.2.11 替换函数语法288

11.3 函数模板289

11.3.1 函数模板特例化290

11.3.2 函数模板重载291

11.3.3 类模板的friend函数模板292

11.4 可变模板293

11.5 本章小结293

第12章 C++I/O揭秘295

12.1 使用流295

12.1.1 流的含义296

12.1.2 流的来源和目标296

12.1.3 流式输出297

12.1.4 流式输入301

12.1.5 对象的输入输出306

12.2 字符串流308

12.3 文件流309

12.3.1 通过seek()和tell()在文件中转移310

12.3.2 将流连接在一起312

12.4 双向I/O312

12.5 本章小结314

第13章 错误处理315

13.1 错误与异常315

13.1.1 异常的含义316

13.1.2 C++中异常的优点316

13.1.3 C++中异常的缺点317

13.1.4 我们的建议317

13.2 异常机制317

13.2.1 抛出并捕获异常318

13.2.2 异常类型321

13.2.3 抛出并捕获多个异常322

13.2.4 未捕获的异常325

13.2.5 抛出列表326

13.3 异常与多态性330

13.3.1 标准异常体系330

13.3.2 在类层次结构中捕获异常332

13.3.3 编写自己的异常类333

13.3.4 嵌套异常335

13.4 堆栈的释放与清理337

13.4.1 使用智能指针338

13.4.2 捕获、清理并重新抛出339

13.5 常见的错误处理问题339

13.5.1 内存分配错误339

13.5.2 构造函数中的错误342

13.5.3 构造函数的function-try-blocks343

13.5.4 析构函数中的错误345

13.6 综合应用346

13.7 本章小结350

第14章 C++运算符重载351

14.1 运算符重载概述351

14.1.1 重载运算符的原因352

14.1.2 运算符重载的限制352

14.1.3 运算符重载的选择352

14.1.4 不要重载的运算符354

14.1.5 可重载运算符小结354

14.1.6 右值引用357

14.1.7 关系运算符358

14.2 重载算术运算符358

14.2.1 重载一元负号和一元正号358

14.2.2 重载递增和递减运算符359

14.3 重载按位运算符和二元逻辑运算符360

14.4 重载插入运算符和提取运算符360

14.5 重载下标运算符362

14.5.1 通过operator[]提供只读访问364

14.5.2 非整数数组索引365

14.6 重载函数调用运算符366

14.7 重载解除引用运算符367

14.7.1 实现operator*368

14.7.2 实现operator->369

14.7.3 operator->的含义369

14.8 编写转换运算符370

14.8.1 转换运算符的多义性问题371

14.8.2 用于布尔表达式的转换372

14.9 重载内存分配和释放运算符373

14.9.1 new和delete的工作原理374

14.9.2 重载operator new和operator delete375

14.9.3 显式地删除/默认化operator new和operator delete377

14.9.4 重载带有额外参数的operator new和operator delete377

14.10 本章小结379

第15章 C++标准库概述381

15.1 编码原则382

15.1.1 使用模板382

15.1.2 使用运算符重载382

15.2 C++标准库概述382

15.2.1 字符串382

15.2.2 正则表达式382

15.2.3 I/O流383

15.2.4 智能指针383

15.2.5 异常383

15.2.6 数学工具383

15.2.7 时间工具384

15.2.8 随机数384

15.2.9 初始化列表384

15.2.10 Pair和Tuple384

15.2.11 函数对象384

15.2.12 多线程384

15.2.13 类型特质385

15.2.14 标准模板库385

15.3 本章小结397

第16章 理解容器与迭代器399

16.1 容器概述399

16.1.1 对元素的要求400

16.1.2 异常和错误检查401

16.1.3 迭代器401

16.2 顺序容器404

16.2.1 vector404

16.2.2 vector<bool>特化420

16.2.3 deque420

16.2.4 list421

16.2.5 forward_list424

16.2.6 array426

16.3 容器适配器427

16.3.1 queue427

16.3.2 priority_queue429

16.3.3 stack432

16.4 关联容器432

16.4.1 pair工具类432

16.4.2 map433

16.4.3 multimap439

16.4.4 set442

16.4.5 multiset444

16.5 无序关联容器/哈希表444

16.5.1 哈希函数444

16.5.2 unordered map446

16.5.3 unordered multimap449

16.5.4 unordered_set/unordered_multiset449

16.6 其他容器449

16.6.1 标准C风格数组449

16.6.2 string450

16.6.3 流451

16.6.4 bitset451

16.7 本章小结455

第17章 掌握STL算法457

17.1 算法概述457

17.1.1 find和find if算法458

17.1.2 accumulate算法460

17.1.3 在算法中使用移动语义461

17.2 lambda表达式461

17.2.1 语法462

17.2.2 泛型Lambda表达式464

17.2.3 Lambda捕捉表达式464

17.2.4 将Lambda表达式用作返回值465

17.2.5 将Lambda表达式用作参数466

17.2.6 STL算法示例466

17.3 函数对象467

17.3.1 算术函数对象468

17.3.2 透明运算符仿函数468

17.3.3 比较函数对象469

17.3.4 逻辑函数对象470

17.3.5 按位函数对象470

17.3.6 函数对象适配器470

17.3.7 编写自己的函数对象474

17.4 算法详解475

17.4.1 迭代器475

17.4.2 非修改序列算法476

17.4.3 修改序列算法480

17.4.4 操作算法486

17.4.5 分区算法487

17.4.6 排序算法488

17.4.7 二叉树搜索算法489

17.4.8 集合算法489

17.4.9 最大/最小算法491

17.4.10 数值处理算法492

17.5 算法示例:审核选民登记493

17.5.1 选民登记审核问题描述493

17.5.2 auditVoterRolls函数493

17.5.3 getDuplicates函数494

17.5.4 测试auditVoterRolls函数495

17.6 本章小结496

第18章 字符串本地化与正则表达式497

18.1 本地化497

18.1.1 本地化字符串字面量497

18.1.2 宽字符498

18.1.3 非西方字符集498

18.1.4 locale和facet500

18.2 正则表达式502

18.2.1 ECMAScript语法503

18.2.2 regex库507

18.2.3 regex_match()508

18.2.4 regex_search()510

18.2.5 regex_iterator512

18.2.6 regex_token_iterator513

18.2.7 regex_replace()515

18.3 本章小结517

第19章 其他库工具519

19.1 std::function519

19.2 有理数521

19.3 Chrono库523

19.3.1 持续时间523

19.3.2 时钟526

19.3.3 时点528

19.4 生成随机数529

19.4.1 随机数引擎530

19.4.2 随机数引擎适配器531

19.4.3 预定义的引擎和引擎适配器532

19.4.4 生成随机数532

19.4.5 随机数分布533

19.5 元组536

19.6 本章小结539

第Ⅳ部分 掌握C++的高级特性543

第20章 自定义和扩展STL543

20.1 分配器543

20.2 迭代器适配器544

20.2.1 反向迭代器544

20.2.2 流迭代器545

20.2.3 插入迭代器546

20.2.4 移动迭代器547

20.3 扩展STL548

20.3.1 扩展STL的原因549

20.3.2 编写STL算法549

20.3.3 编写STL容器551

20.4 本章小结582

第21章 模板的高级特性583

21.1 深入了解模板参数583

21.1.1 深入了解模板类型参数583

21.1.2 模板参数模板介绍586

21.1.3 深入了解非类型模板参数587

21.2 模板类部分特例化589

21.3 通过重载模拟函数部分特例化592

21.4 模板递归593

21.4.1 N维网格:初次尝试593

21.4.2 真正的N维网格595

21.5 类型推导597

21.6 可变参数模板600

21.6.1 类型安全的可变长度参数列表600

21.6.2 可变数目的混入类602

21.7 元编程603

21.7.1 编译时阶乘603

21.7.2 循环展开604

21.7.3 打印元组605

21.7.4 类型trait607

21.7.5 结论612

21.8 本章小结612

第22章 内存管理613

22.1 使用动态内存614

22.1.1 如何描绘内存614

22.1.2 分配和释放615

22.1.3 数组616

22.1.4 使用指针622

22.2 数组-指针的对偶性624

22.2.1 数组就是指针624

22.2.2 并非所有的指针都是数组626

22.3 低级内存操作626

22.3.1 指针运算626

22.3.2 自定义内存管理627

22.3.3 垃圾回收627

22.3.4 对象池628

22.3.5 函数指针628

22.3.6 方法和数据成员的指针630

22.4 智能指针630

22.4.1 旧的过时的auto_ptr631

22.4.2 shared_ptr和unique_ptr智能指针631

22.5 内存常见的陷阱636

22.5.1 分配不足的字符串637

22.5.2 访问内存越界637

22.5.3 内存泄漏638

22.5.4 双重删除和无效指针640

22.6 本章小结641

第23章 C++多线程编程643

23.1 简介643

23.1.1 竞争条件645

23.1.2 死锁646

23.1.3 撕裂647

23.1.4 缓存的一致性647

23.2 线程647

23.2.1 通过函数指针创建线程647

23.2.2 通过函数对象创建线程649

23.2.3 通过lambda创建线程650

23.2.4 通过成员函数创建线程651

23.2.5 线程本地存储651

23.2.6 取消线程652

23.2.7 从线程获得结果652

23.2.8 复制和重新抛出异常652

23.3 原子操作库654

23.3.1 原子类型示例655

23.3.2 原子操作657

23.4 互斥658

23.4.1 互斥体类658

23.4.2 锁660

23.4.3 std::call_once661

23.4.4 互斥体的用法示例663

23.5 条件变量665

23.6 future667

23.7 异常处理669

23.8 示例:多线程日志记录器类669

23.9 线程池673

23.10 线程设计和最佳实践674

23.11 本章小结675

第Ⅴ部分 C++软件工程679

第24章 充分利用软件工程方法679

24.1 过程的必要性679

24.2 软件生命周期模型680

24.2.1 分段模型和瀑布模型680

24.2.2 螺旋模型683

24.2.3 Rational统一过程685

24.3 软件工程方法学686

24.3.1 敏捷686

24.3.2 Scrum686

24.3.3 极限编程688

24.3.4 软件分流691

24.4 构建自己的过程和方法691

24.4.1 对新思想采取开放态度692

24.4.2 提出新想法692

24.4.3 知道什么行得通什么行不通692

24.4.4 不要逃避692

24.5 源代码控制692

24.6 本章小结694

第25章 编写高效的C++程序695

25.1 性能和效率概述695

25.1.1 提升效率的两种方式696

25.1.2 两种程序696

25.1.3 C++是不是低效的语言696

25.2 语言层次的效率696

25.2.1 高效地操纵对象697

25.2.2 使用内联方法和函数700

25.3 设计层次的效率700

25.3.1 尽可能多地缓存701

25.3.2 使用对象池701

25.4 剖析705

25.4.1 使用gprof的剖析范例705

25.4.2 使用Visual C++2013的剖析范例713

25.5 本章小结716

第26章 熟练掌握调试技术717

26.1 调试的基本定律717

26.2 bug分类学718

26.3 避免bug718

26.4 为bug做好规划719

26.4.1 错误日志719

26.4.2 调试跟踪720

26.4.3 断言727

26.4.4 静态断言728

26.4.5 崩溃转储729

26.5 调试技术729

26.5.1 重现bug729

26.5.2 调试可重复的bug730

26.5.3 调试不可重现的bug730

26.5.4 调试退化731

26.5.5 调试内存问题731

26.5.6 调试多线程程序735

26.5.7 调试示例:文章引用736

26.5.8 从ArticleCitations示例中总结的教训746

26.6 本章小结747

附录A C++面试749

附录B 带注解的参考文献767

附录C 标准库头文件777

热门推荐