《C++ 程序设计语言(第 1 - 3 部分)(原书第 4 版)》带书签 高清 电子书 PDF 下载
作者: Bjarne Stroustrup
出版社: 机械工业出版社
原作名: The C++ Programming Language, Fourth Edition
译者: 王刚 / 杨巨峰
出版年: 2016-7
装帧: 平装
丛书: 计算机科学丛书
ISBN: 9787111539414
下载地址
https://pan.quark.cn/s/a89887846907
内容简介
《C++程序设计语言》(原书第4版)是C++领域最经典的参考书,介绍了C++11的各项新特性和新功能。全书共分四部分。第一部分(第1~5章)是引言,包括C++的背景知识,C++语言及其标准库的简要介绍;第二部分(第6~15章)介绍C++的内置类型和基本特性,以及如何用它们构造程序;第三部分(第16~29章)介绍C++的抽象机制及如何用这些机制编写面向对象程序和泛型程序;第四部分(第30~44章)概述标准库并讨论一些兼容性问题。由于篇幅问题,原书中文版分两册出版,分别对应原书的第一至三部分和第四部分。这一册为第一至三部分。
作者简介
作者:(美国)本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) 译者:王刚 杨巨峰
本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup),C++语言的设计者和最初实现者,C++语言ISO标准化工作的积极参与者,同时也是《C++程序设计语言》和《C++程序设计原理与实践》的作者。他是英国剑桥大学计算机科学专业博士,1979年加入美国新泽西贝尔实验室,从成立到2002年一直担任贝尔实验室大规模程序设计研究部门的负责人。2002年至2014年,Bjarne被评为德州农工大学工程学院计算机科学首席教授,哥伦比亚大学计算机科学系客座教授,德州农工大学计算机科学系杰出研究教授。多年来,他为剑桥大学、哥伦比亚大学和普林斯顿大学等知名学府的计算机科学教学事业倾注了大量的热情和精力。商业领域方面,Bjarne是RollApp科技公司的资深顾问。2014年,Bjame加入摩根士丹利纽约总部,任职技术与数据部门的董事总经理。他是美国国家工程院院士、IEEE会士和ACM会士,研究兴趣包括分布式系统、设计、程序设计技术、软件开发工具和程序设计语言。
目录
出版者的话 译者序 前言 第3版前言 第2版前言 第1版前言 第一部分 引言 第1章 致读者 2 1.1 本书结构 2 1.1.1 引言 2 1.1.2 基本特性 3 1.1.3 抽象机制 4 1.1.4 标准库 5 1.1.5 例子和参考文献 5 1.2 C++的设计 7 1.2.1 程序设计风格 8 1.2.2 类型检查 11 1.2.3 C兼容性 12 1.2.4 语言、库和系统 12 1.3 学习C++ 14 1.3.1 用C++编程 15 1.3.2 对C++程序员的建议 16 1.3.3 对C程序员的建议 16 1.3.4 对Java程序员的建议 17 1.4 C++的历史 18 1.4.1 大事年表 19 1.4.2 早期的C++ 19 1.4.3 1998标准 21 1.4.4 2011标准 23 1.4.5 C++的用途 26 1.5 建议 27 1.6 参考文献 28 第2章 C++概览:基础知识 32 2.1 引言 32 2.2 基本概念 33 2.2.1 Hello,World! 33 2.2.2 类型、变量和算术运算 34 2.2.3 常量 36 2.2.4 检验和循环 37 2.2.5 指针、数组和循环 38 2.3 用户自定义类型 40 2.3.1 结构 41 2.3.2 类 42 2.3.3 枚举 43 2.4 模块化 44 2.4.1 分离编译 45 2.4.2 名字空间 46 2.4.3 错误处理 47 2.5 附记 50 2.6 建议 50 第3章 C++概览:抽象机制 51 3.1 引言 51 3.2 类 51 3.2.1 具体类型 52 3.2.2 抽象类型 56 3.2.3 虚函数 58 3.2.4 类层次 59 3.3 拷贝和移动 62 3.3.1 拷贝容器 63 3.3.2 移动容器 64 3.3.3 资源管理 66 3.3.4 抑制操作 66 3.4 模板 67 3.4.1 参数化类型 67 3.4.2 函数模板 69 3.4.3 函数对象 69 3.4.4 可变参数模板 71 3.4.5 别名 72 3.5 建议 73 第4章 C++概览:容器与算法 74 4.1 标准库 74 4.1.1 标准库概述 75 4.1.2 标准库头文件与名字空间 75 4.2 字符串 77 4.3 I/O流 78 4.3.1 输出 78 4.3.2 输入 79 4.3.3 用户自定义类型的I/O 80 4.4 容器 81 4.4.1 vector 81 4.4.2 list 84 4.4.3 map 85 4.4.4 unordered_map 86 4.4.5 容器概述 86 4.5 算法 87 4.5.1 使用迭代器 88 4.5.2 迭代器类型 90 4.5.3 流迭代器 91 4.5.4 谓词 93 4.5.5 算法概述 93 4.5.6 容器算法 94 4.6 建议 94 第5章 C++概览:并发与实用功能 96 5.1 引言 96 5.2 资源管理 96 5.2.1 unique_ptr与shared_ptr 97 5.3 并发 99 5.3.1 任务和thread 99 5.3.2 传递参数 100 5.3.3 返回结果 100 5.3.4 共享数据 101 5.3.5 任务通信 103 5.4 小工具组件 106 5.4.1 时间 106 5.4.2 类型函数 107 5.4.3 pair和tuple 109 5.5 正则表达式 110 5.6 数学计算 111 5.6.1 数学函数和算法 111 5.6.2 复数 111 5.6.3 随机数 112 5.6.4 向量算术 113 5.6.5 数值限制 113 5.7 建议 114 第二部分 基本功能 第6章 类型与声明 116 6.1 ISO C++标准 116 6.1.1 实现 117 6.1.2 基本源程序字符集 118 6.2 类型 118 6.2.1 基本类型 119 6.2.2 布尔值 119 6.2.3 字符类型 121 6.2.4 整数类型 124 6.2.5 浮点数类型 126 6.2.6 前缀和后缀 127 6.2.7 void 128 6.2.8 类型尺寸 128 6.2.9 对齐 130 6.3 声明 131 6.3.1 声明的结构 133 6.3.2 声明多个名字 134 6.3.3 名字 134 6.3.4 作用域 136 6.3.5 初始化 138 6.3.6 推断类型:auto和decltype() 141 6.4 对象和值 144 6.4.1 左值和右值 144 6.4.2 对象的生命周期 145 6.5 类型别名 146 6.6 建议 147 第7章 指针、数组与引用 148 7.1 引言 148 7.2 指针 148 7.2.1 void* 149 7.2.2 nullptr 150 7.3 数组 150 7.3.1 数组的初始化器 152 7.3.2 字符串字面值常量 152 7.4 数组中的指针 155 7.4.1 数组漫游 156 7.4.2 多维数组 158 7.4.3 传递数组 159 7.5 指针与const 161 7.6 指针与所有权 163 7.7 引用 163 7.7.1 左值引用 164 7.7.2 右值引用 167 7.7.3 引用的引用 169 7.7.4 指针与引用 170 7.8 建议 172 第8章 结构、联合与枚举 173 8.1 引言 173 8.2 结构 173 8.2.1 struct的布局 175 8.2.2 struct的名字 176 8.2.3 结构与类 177 8.2.4 结构与数组 178 8.2.5 类型等价 180 8.2.6 普通旧数据 180 8.2.7 域 182 8.3 联合 183 8.3.1 联合与类 185 8.3.2 匿名 186 8.4 枚举 188 8.4.1 enum class 188 8.4.2 普通的enum 191 8.4.3 未命名的enum 192 8.5 建议 193 第9章 语句 194 9.1 引言 194 9.2 语句概述 194 9.3 声明作为语句 195 9.4 选择语句 196 9.4.1 if语句 196 9.4.2 switch语句 198 9.4.3 条件中的声明 200 9.5 循环语句 201 9.5.1 范围for语句 201 9.5.2 for语句 202 9.5.3 while语句 203 9.5.4 do语句 203 9.5.5 退出循环 204 9.6 goto语句 204 9.7 注释与缩进 205 9.8 建议 207 第10章 表达式 208 10.1 引言 208 10.2 一个桌面计算器示例 208 10.2.1 分析器 209 10.2.2 输入 213 10.2.3 底层输入 216 10.2.4 错误处理 217 10.2.5 驱动程序 217 10.2.6 头文件 218 10.2.7 命令行参数 218 10.2.8 关于风格 220 10.3 运算符概述 220 10.3.1 结果 224 10.3.2 求值顺序 224 10.3.3 运算符优先级 225 10.3.4 临时对象 226 10.4 常量表达式 227 10.4.1 符号化常量 229 10.4.2 常量表达式中的const 229 10.4.3 字面值常量类型 229 10.4.4 引用参数 230 10.4.5 地址常量表达式 231 10.5 隐式类型转换 231 10.5.1 提升 231 10.5.2 类型转换 232 10.5.3 常用的算术类型转换 234 10.6 建议 235 第11章 选择适当的操作 236 11.1 其他运算符 236 11.1.1 逻辑运算符 236 11.1.2 位逻辑运算符 236 11.1.3 条件表达式 238 11.1.4 递增与递减 238 11.2 自由存储 240 11.2.1 内存管理 241 11.2.2 数组 243 11.2.3 获取内存空间 244 11.2.4 重载new 245 11.3 列表 247 11.3.1 实现模型 248 11.3.2 限定列表 249 11.3.3 未限定列表 249 11.4 lambda表达式 251 11.4.1 实现模型 251 11.4.2 lambda的替代品 252 11.4.3 捕获 254 11.4.4 调用与返回 257 11.4.5 lambda的类型 257 11.5 显式类型转换 258 11.5.1 构造 259 11.5.2 命名转换 261 11.5.3 C风格的转换 262 11.5.4 函数形式的转换 262 11.6 建议 263 第12章 函数 264 12.1 函数声明 264 12.1.1 为什么使用函数 265 12.1.2 函数声明的组成要件 265 12.1.3 函数定义 266 12.1.4 返回值 267 12.1.5 inline函数 269 12.1.6 constexpr函数 269 12.1.7 [[noreturn]]函数 271 12.1.8 局部变量 272 12.2 参数传递 273 12.2.1 引用参数 273 12.2.2 数组参数 275 12.2.3 列表参数 277 12.2.4 数量未定的参数 278 12.2.5 默认参数 281 12.3 重载函数 282 12.3.1 自动重载解析 283 12.3.2 重载与返回类型 284 12.3.3 重载与作用域 285 12.3.4 多实参解析 285 12.3.5 手动重载解析 286 12.4 前置与后置条件 286 12.5 函数指针 288 12.6 宏 292 12.6.1 条件编译 294 12.6.2 预定义宏 295 12.6.3 编译指令 296 12.7 建议 296 第13章 异常处理 297 13.1 错误处理 297 13.1.1 异常 298 13.1.2 传统的错误处理 299 13.1.3 渐进决策 300 13.1.4 另一种视角看异常 301 13.1.5 何时不应使用异常 302 13.1.6 层次化错误处理 303 13.1.7 异常与效率 304 13.2 异常保障 305 13.3 资源管理 307 13.3.1 finally 310 13.4 强制不变式 311 13.5 抛出与捕获异常 315 13.5.1 抛出异常 315 13.5.2 捕获异常 318 13.5.3 异常与线程 324 13.6 vector的实现 324 13.6.1 一个简单的vector 325 13.6.2 显式地表示内存 328 13.6.3 赋值 331 13.6.4 改变尺寸 332 13.7 建议 335 第14章 名字空间 337 14.1 组合问题 337 14.2 名字空间 338 14.2.1 显式限定 339 14.2.2 using声明 340 14.2.3 using指示 341 14.2.4 参数依赖查找 342 14.2.5 名字空间是开放的 344 14.3 模块化和接口 345 14.3.1 名字空间作为模块 346 14.3.2 实现 348 14.3.3 接口和名字 349 14.4 组合使用名字空间 351 14.4.1 便利性与安全性 351 14.4.2 名字空间别名 352 14.4.3 组合名字空间 352 14.4.4 组合与选择 353 14.4.5 名字空间和重载 354 14.4.6 版本控制 356 14.4.7 名字空间嵌套 358 14.4.8 无名名字空间 359 14.4.9 C头文件 359 14.5 建议 360 第15章 源文件与程序 362 15.1 分离编译 362 15.2 链接 363 15.2.1 文件内名字 365 15.2.2 头文件 366 15.2.3 单一定义规则 368 15.2.4 标准库头文件 369 15.2.5 链接非C++代码 370 15.2.6 链接和函数指针 372 15.3 使用头文件 373 15.3.1 单头文件组织 373 15.3.2 多头文件组织 376 15.3.3 包含保护 380 15.4 程序 381 15.4.1 非局部变量初始化 381 15.4.2 初始化和并发 382 15.4.3 程序终止 383 15.5 建议 384 第三部分 抽象机制 第16章 类 386 16.1 引言 386 16.2 类基础 387 16.2.1 成员函数 388 16.2.2 默认拷贝 389 16.2.3 访问控制 389 16.2.4 class和struct 390 16.2.5 构造函数 391 16.2.6 explicit构造函数 393 16.2.7 类内初始化器 395 16.2.8 类内函数定义 395 16.2.9 可变性 396 16.2.10 自引用 399 16.2.11 成员访问 400 16.2.12 static成员 401 16.2.13 成员类型 403 16.3 具体类 403 16.3.1 成员函数 406 16.3.2 辅助函数 408 16.3.3 重载运算符 410 16.3.4 具体类的重要性 410 16.4 建议 411 第17章 构造、清理、拷贝和移动 413 17.1 引言 413 17.2 构造函数和析构函数 415 17.2.1 构造函数和不变式 415 17.2.2 析构函数和资源 416 17.2.3 基类和成员析构函数 417 17.2.4 调用构造函数和析构函数 418 17.2.5 virtual析构函数 419 17.3 类对象初始化 420 17.3.1 不使用构造函数进行初始化 420 17.3.2 使用构造函数进行初始化 421 17.3.3 默认构造函数 424 17.3.4 初始化器列表构造函数 425 17.4 成员和基类初始化 429 17.4.1 成员初始化 429 17.4.2 基类初始化器 431 17.4.3 委托构造函数 431 17.4.4 类内初始化器 432 17.4.5 static成员初始化 434 17.5 拷贝和移动 435 17.5.1 拷贝 435 17.5.2 移动 441 17.6 生成默认操作 444 17.6.1 显式声明默认操作 444 17.6.2 默认操作 445 17.6.3 使用默认操作 446 17.6.4 使用delete删除的函数 449 17.7 建议 451 第18章 运算符重载 452 18.1 引言 452 18.2 运算符函数 453 18.2.1 二元和一元运算符 454 18.2.2 运算符的预置含义 455 18.2.3 运算符与用户自定义类型 456 18.2.4 传递对象 456 18.2.5 名字空间中的运算符 457 18.3 复数类型 459 18.3.1 成员和非成员运算符 459 18.3.2 混合模式运算 460 18.3.3 类型转换 461 18.3.4 字面值常量 463 18.3.5 访问函数 464 18.3.6 辅助函数 465 18.4 类型转换 466 18.4.1 类型转换运算符 466 18.4.2 explicit类型转换运算符 467 18.4.3 二义性 468 18.5 建议 469 第19章 特殊运算符 471 19.1 引言 471 19.2 特殊运算符 471 19.2.1 取下标 471 19.2.2 函数调用 472 19.2.3 解引用 473 19.2.4 递增和递减 475 19.2.5 分配和释放 477 19.2.6 用户自定义字面值常量 478 19.3 字符串类 481 19.3.1 必备操作 481 19.3.2 访问字符 482 19.3.3 类的表示 483 19.3.4 成员函数 485 19.3.5 辅助函数 487 19.3.6 应用String 489 19.4 友元 490 19.4.1 发现友元 491 19.4.2 友元与成员 492 19.5 建议 493 第20章 派生类 495 20.1 引言 495 20.2 派生类 496 20.2.1 成员函数 498 20.2.2 构造函数和析构函数 499 20.3 类层次 500 20.3.1 类型域 500 20.3.2 虚函数 502 20.3.3 显式限定 504 20.3.4 覆盖控制 505 20.3.5 using基类成员 508 20.3.6 返回类型放松 511 20.4 抽象类 512 20.5 访问控制 514 20.5.1 protected成员 517 20.5.2 访问基类 518 20.5.3 using声明与访问控制 519 20.6 成员指针 520 20.6.1 函数成员指针 520 20.6.2 数据成员指针 522 20.6.3 基类和派生类成员 523 20.7 建议 523 第21章 类层次 524 21.1 引言 524 21.2 设计类层次 524 21.2.1 实现继承 525 21.2.2 接口继承 527 21.2.3 替代实现方式 529 21.2.4 定位对象创建 532 21.3 多重继承 533 21.3.1 多重接口 533 21.3.2 多重实现类 533 21.3.3 二义性解析 535 21.3.4 重复使用基类 538 21.3.5 虚基类 539 21.3.6 重复基类与虚基类 544 21.4 建议 546 第22章 运行时类型信息 547 22.1 引言 547 22.2 类层次导航 547 22.2.1 dynamic_cast 548 22.2.2 多重继承 551 22.2.3 static_cast和dynamic_cast 552 22.2.4 恢复接口 553 22.3 双重分发和访客 557 22.3.1 双重分发 557 22.3.2 访客 559 22.4 构造和析构 561 22.5 类型识别 561 22.5.1 扩展类型信息 563 22.6 RTTI的使用和误用 564 22.7 建议 565 第23章 模板 566 23.1 引言和概述 566 23.2 一个简单的字符串模板 568 23.2.1 定义模板 569 23.2.2 模板实例化 571 23.3 类型检查 571 23.3.1 类型等价 572 23.3.2 错误检测 573 23.4 类模板成员 574 23.4.1 数据成员 574 23.4.2 成员函数 575 23.4.3 成员类型别名 575 23.4.4 static成员 575 23.4.5 成员类型 576 23.4.6 成员模板 577 23.4.7 友元 580 23.5 函数模板 582 23.5.1 函数模板实参 583 23.5.2 函数模板实参推断 584 23.5.3 函数模板重载 586 23.6 模板别名 590 23.7 源码组织 591 23.7.1 链接 593 23.8 建议 594 第24章 泛型程序设计 595 24.1 引言 595 24.2 算法和提升 596 24.3 概念 599 24.3.1 发现概念 599 24.3.2 概念和约束 602 24.4 具体化概念 604 24.4.1 公理 607 24.4.2 多实参概念 607 24.4.3 值概念 608 24.4.4 约束检查 609 24.4.5 模板定义检查 610 24.5 建议 612 第25章 特例化 613 25.1 引言 613 25.2 模板参数和实参 614 25.2.1 类型作为实参 614 25.2.2 值作为实参 615 25.2.3 操作作为实参 616 25.2.4 模板作为实参 618 25.2.5 默认模板实参 619 25.3 特例化 621 25.3.1 接口特例化 623 25.3.2 主模板 624 25.3.3 特例化顺序 625 25.3.4 函数模板特例化 626 25.4 建议 628 第26章 实例化 629 26.1 引言 629 26.2 模板实例化 630 26.2.1 何时需要实例化 630 26.2.2 手工控制实例化 631 26.3 名字绑定 632 26.3.1 依赖性名字 633 26.3.2 定义点绑定 635 26.3.3 实例化点绑定 636 26.3.4 多实例化点 638 26.3.5 模板和名字空间 639 26.3.6 过于激进的ADL 639 26.3.7 来自基类的名字 641 26.4 建议 643 第27章 模板和类层次 645 27.1 引言 645 27.2 参数化和类层次 646 27.2.1 生成类型 647 27.2.2 模板类型转换 649 27.3 类模板层次 650 27.3.1 模板作为接口 651 27.4 模板参数作为基类 652 27.4.1 组合数据结构 652 27.4.2 线性化类层次 655 27.5 建议 660 第28章 元编程 661 28.1 引言 661 28.2 类型函数 663 28.2.1 类型别名 665 28.2.2 类型谓词 666 28.2.3 选择函数 668 28.2.4 萃取 668 28.3 控制结构 670 28.3.1 选择 670 28.3.2 迭代和递归 673 28.3.3 何时使用元编程 674 28.4 条件定义:Enable_if 675 28.4.1 使用Enable_if 676 28.4.2 实现Enable_if 678 28.4.3 Enable_if与概念 678 28.4.4 更多Enable_if例子 679 28.5 一个编译时列表:Tuple 681 28.5.1 一个简单的输出函数 683 28.5.2 元素访问 684 28.5.3 make_tuple 686 28.6 可变参数模板 686 28.6.1 一个类型安全的printf() 687 28.6.2 技术细节 689 28.6.3 转发 691 28.6.4 标准库tuple 692 28.7 国际标准单位例子 694 28.7.1 Unit 695 28.7.2 Quantity 696 28.7.3 Unit字面值常量 697 28.7.4 工具函数 698 28.8 建议 700 第29章 一个矩阵设计 701 29.1 引言 701 29.1.1 Matrix的基本使用 701 29.1.2 对Matrix的要求 703 29.2 Matrix模板 704 29.2.1 构造和赋值 705 29.2.2 下标和切片 706 29.3 Matrix算术运算 708 29.3.1 标量运算 709 29.3.2 加法 710 29.3.3 乘法 711 29.4 Matrix实现 712 29.4.1 slice() 713 29.4.2 Matrix切片 713 29.4.3 Matrix_ref 714 29.4.4 Matrix列表初始化 715 29.4.5 Matrix访问 717 29.4.6 零维Matrix 719 29.5 求解线性方程组 720 29.5.1 经典高斯消去法 721 29.5.2 旋转 722 29.5.3 测试 723 29.5.4 熔合运算 723 29.6 建议 725