| 作者 |
| (美)本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) |
| 丛书名 |
| 计算机科学丛书 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9781912091013 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 ---------------------------C++程序设计:原理与实践(基础篇)(原书第2版)--------------------------- C++之父Bjarne Stroustrup的经典著作《C++程序设计:原理与实践(原书第2版)》基于最新的C++11和C++14,广泛地介绍了程序设计的基本概念和技术,包括类型系统、算术运算、控制结构、错误处理等;介绍了从键盘和文件获取数值和文本数据的方法以及以图形化方式表示数值数据、文本和几何图形;介绍了C++标准库中的容器(如向量、列表、映射)和算法(如排序、查找和内积)的设计和使用。同时还对C++思想和历史进行了详细的讨论,很好地拓宽了读者的视野。 为方便读者循序渐进地学习,加上篇幅所限,《C++程序设计:原理与实践(原书第2版)》分为基础篇和进阶篇两册出版,基础篇包括第1~11章、第17~19章和附录A、C,进阶篇包括第12~16章、第20~27章和附录B、D、E。本书是基础篇。 本书通俗易懂、实例丰富,可作为大学计算机、电子工程、信息科学等相关专业的教材,也可供相关专业人员参考。 ---------------------------C++程序设计:原理与实践(进阶篇)(原书第2版)--------------------------- C++之父Bjarne Stroustrup经典著作《C++程序设计:原理与实践(原书第2版)》基于最新的C++11和C++14,广泛地介绍了程序设计的基本概念和技术,包括类型系统、算术运算、控制结构、错误处理等;介绍了从键盘和文件获取数值和文本数据的方法以及以图形化方式表示数值数据、文本和几何图形;介绍了C++标准库中的容器(如向量、列表、映射)和算法(如排序、查找和内积)的设计和使用。同时还对C++思想和历史进行了详细的讨论,很好地拓宽了读者的视野。 为方便读者循序渐进地学习,加上篇幅所限,《C++程序设计:原理与实践(原书第2版)》分为基础篇和进阶篇两册出版,基础篇包括第1~11章、第17~19章和附录A、C,进阶篇包括第12~16章、第20~27章和附录B、D、E。本书是进阶篇。 本书通俗易懂、实例丰富,可作为大学计算机、电子工程、信息科学等相关专业的教材,也可供相关专业人员参考。 |
| 目录 |
---------------------------C++程序设计:原理与实践(基础篇)(原书第2版)--------------------------- 出版者的话 译者序 前言 引言 作者简介 第1章 计算机、人与程序设计 1 1.1 简介 1 1.2 软件 1 1.3 人 3 1.4 计算机科学 5 1.5 计算机已无处不在 6 1.5.1 有屏幕和无屏幕 6 1.5.2 船舶 6 1.5.3 电信 7 1.5.4 医疗 9 1.5.5 信息领域 10 1.5.6 一种垂直的视角 11 1.5.7 与C++程序设计有何联系 12 1.6 程序员的理想境界 12 思考题 14 术语 15 习题 15 附言 16 第2章 Hello, World! 17 2.1 程序 17 2.2 经典的第一个程序 17 2.3 编译 20 2.4 链接 22 2.5 编程环境 22 简单练习 23 思考题 24 术语 25 习题 25 附言 26 第3章 对象、类型和值 27 3.1 输入 27 3.2 变量 28 3.3 输入和类型 29 3.4 运算和运算符 31 3.5 赋值和初始化 33 3.5.1 实例:检测重复单词 34 3.6 复合赋值运算符 36 3.6.1 实例:重复单词计数 36 3.7 命名 37 3.8 类型和对象 39 3.9 类型安全 40 3.9.1 安全转换 40 3.9.2 不安全转换 41 简单练习 43 思考题 44 术语 45 习题 45 附言 46 第4章 计算 47 4.1 简介 47 4.2 目标和工具 48 4.3 表达式 50 4.3.1 常量表达式 51 4.3.2 运算符 52 4.3.3 类型转换 53 4.4 语句 54 4.4.1 选择语句 55 4.4.2 循环语句 59 4.5 函数 62 4.5.1 为什么使用函数 64 4.5.2 函数声明 65 4.6 vector 65 4.6.1 遍历一个vector 66 4.6.2 vector空间增长 67 4.6.3 一个数值计算实例 67 4.6.4 一个文本实例 69 4.7 语言特性 70 简单练习 71 思考题 71 术语 72 习题 72 附言 74 第5章 错误 75 5.1 简介 75 5.2 错误的来源 76 5.3 编译时错误 77 5.3.1 语法错误 77 5.3.2 类型错误 78 5.3.3 警告 78 5.4 链接时错误 79 5.5 运行时错误 79 5.5.1 调用者处理错误 80 5.5.2 被调用者处理错误 81 5.5.3 报告错误 82 5.6 异常 83 5.6.1 参数错误 84 5.6.2 范围错误 85 5.6.3 输入错误 86 5.6.4 窄化错误 88 5.7 逻辑错误 89 5.8 估计 91 5.9 调试 92 5.9.1 实用调试建议 93 5.10 前置条件和后置条件 95 5.10.1 后置条件 97 5.11 测试 98 简单练习 98 思考题 99 术语 100 习题 100 附言 102 第6章 编写一个程序 103 6.1 一个问题 103 6.2 对问题的思考 103 6.2.1 程序设计的几个阶段 104 6.2.2 策略 104 6.3 回到计算器问题 106 6.3.1 第一步尝试 106 6.3.2 单词 108 6.3.3 实现单词 109 6.3.4 使用单词 110 6.3.5 重新开始 111 6.4 文法 112 6.4.1 英文文法 116 6.4.2 设计一个文法 117 6.5 将文法转换为程序 117 6.5.1 实现文法规则 118 6.5.2 表达式 118 6.5.3 项 121 6.5.4 基本表达式 123 6.6 试验第一个版本 123 6.7 试验第二个版本 126 6.8 单词流 128 6.8.1 实现Token_stream 129 6.8.2 读单词 130 6.8.3 读数值 131 6.9 程序结构 131 简单练习 133 思考题 133 术语 134 习题 134 附言 135 第7章 完成一个程序 136 7.1 简介 136 7.2 输入和输出 136 7.3 错误处理 138 7.4 处理负数 141 7.5 模运算% 142 7.6 清理代码 143 7.6.1 符号常量 143 7.6.2 使用函数 145 7.6.3 代码布局 145 7.6.4 注释 146 7.7 错误恢复 148 7.8 变量 150 7.8.1 变量和定义 150 7.8.2 引入name单词 154 7.8.3 预定义名字 156 7.8.4 我们到达目的地了吗 156 简单练习 157 思考题 157 术语 158 习题 158 附言 159 第8章 函数相关的技术细节 160 8.1 技术细节 160 8.2 声明和定义 161 8.2.1 声明的类别 164 8.2.2 变量和常量声明 164 8.2.3 默认初始化 165 8.3 头文件 165 8.4 作用域 167 8.5 函数调用和返回 171 8.5.1 声明参数和返回类型 171 8.5.2 返回一个值 172 8.5.3 传值 173 8.5.4 传常量引用 174 8.5.5 传引用 176 8.5.6 传值与传引用的对比 178 8.5.7 参数检查和转换 179 8.5.8 实现函数调用 180 8.5.9 constexpr函数 183 8.6 计算顺序 184 8.6.1 表达式计算 185 8.6.2 全局初始化 186 8.7 名字空间 187 8.7.1 using声明和using指令 188 简单练习 189 思考题 190 术语 191 习题 191 附言 192 第9章 类相关的技术细节 193 9.1 用户自定义类型 193 9.2 类和成员 194 9.3 接口和实现 194 9.4 演化一个类 196 9.4.1 结构和函数 196 9.4.2 成员函数和构造函数 197 9.4.3 保持细节私有性 199 9.4.4 定义成员函数 200 9.4.5 引用当前对象 202 9.4.6 报告错误 202 9.5 枚举类型 203 9.5.1 “平坦”枚举 205 9.6 运算符重载 205 9.7 类接口 206 9.7.1 参数类型 207 9.7.2 拷贝 209 9.7.3 默认构造函数 209 9.7.4 const成员函数 212 9.7.5 类成员和“辅助函数” 213 9.8 Date类 214 简单练习 217 思考题 218 术语 218 习题 218 附言 220 第10章 输入输出流 221 10.1 输入和输出 221 10.2 I/O流模型 222 10.3 文件 223 10.4 打开文件 224 10.5 读写文件 226 10.6 I/O错误处理 227 10.7 读取单个值 229 10.7.1 将程序分解为易管理的子模块 231 10.7.2 将人机对话从函数中分离 233 10.8 用户自定义输出运算符 234 10.9 用户自定义输入运算符 235 10.10 一个标准的输入循环 235 10.11 读取结构化的文件 236 10.11.1 在内存中的表示 237 10.11.2 读取结构化的值 238 10.11.3 改变表示方法 241 练习 242 思考题 243 术语 243 习题 243 附言 244 第11章 定制输入输出 245 11.1 有规律的与无规律的输入和输出 245 11.2 格式化输出 245 11.2.1 输出整数 246 11.2.2 输入整数 247 11.2.3 输出浮点数 248 11.2.4 精度 249 11.2.5 域 250 11.3 打开和定位文件 250 11.3.1 文件打开模式 251 11.3.2 二进制文件 252 11.3.3 在文件中定位 254 11.4 字符串流 254 11.5 面向行的输入 255 11.6 字符分类 256 11.7 使用非标准分隔符 258 11.8 更多未讨论内容 263 简单练习 263 思考题 264 术语 264 习题 265 附言 266 第12章 向量和自由空间 267 12.1 简介 267 12.2 vector的基本知识 268 12.3 内存、地址和指针 269 12.3.1 sizeof运算符 271 12.4 自由空间和指针 272 12.4.1 自由空间分配 273 12.4.2 通过指针访问数据 274 12.4.3 指针范围 274 12.4.4 初始化 276 12.4.5 空指针 277 12.4.6 自由空间释放 277 12.5 析构函数 279 12.5.1 生成的析构函数 280 12.5.2 析构函数和自由空间 281 12.6 访问元素 282 12.7 指向类对象的指针 283 12.8 类型混用:void*和类型转换 284 12.9 指针和引用 285 12.9.1 指针参数和引用参数 286 12.9.2 指针、引用和继承 287 12.9.3 实例:链表 287 12.9.4 链表操作 289 12.9.5 链表的使用 290 12.10 this指针 291 12.10.1 关于链表使用的更多讨论 293 简单练习 294 思考题 294 术语 295 习题 295 附言 296 第13章 向量和数组 297 13.1 简介 297 13.2 初始化 298 13.3 拷贝 299 13.3.1 拷贝构造函数 300 13.3.2 拷贝赋值 301 13.3.3 拷贝术语 303 13.3.4 移动 304 13.4 必要的操作 305 13.4.1 显式构造函数 307 13.4.2 调试构造函数和析构函数 308 13.5 访问vector元素 309 13.5.1 对const向量重载运算符 311 13.6 数组 311 13.6.1 指向数组元素的指针 312 13.6.2 指针和数组 314 13.6.3 数组初始化 316 13.6.4 指针问题 316 13.7 实例:回文 319 13.7.1 使用string实现回文 319 13.7.2 使用数组实现回文 320 13.7.3 使用指针实现回文 321 简单练习 321 思考题 322 术语 323 习题 323 附言 324 第14章 向量、模板和异常 325 14.1 问题 325 14.2 改变大小 327 14.2.1 表示方式 327 14.2.2 reserve和capacity 328 14.2.3 resize 329 14.2.4 push_back 329 14.2.5 赋值 330 14.2.6 到目前为止的vector类 331 14.3 模板 332 14.3.1 类型作为模板参数 333 14.3.2 泛型编程 335 14.3.3 概念 336 14.3.4 容器和继承 338 14.3.5 整数作为模板参数 338 14.3.6 模板实参推断 340 14.3.7 泛化vector 340 14.4 范围检查和异常 342 14.4.1 旁白:设计上的考虑 343 14.4.2 坦白:使用宏 344 14.5 资源和异常 345 14.5.1 潜在的资源管理问题 346 14.5.2 资源获取即初始化 348 14.5.3 保证 348 14.5.4 unique_ptr 349 14.5.5 以移动方式返回结果 350 14.5.6 vector类的RAII 351 简单练习 352 思考题 353 术语 354 习题 354 附言 355 附录A C++语言概要 356 附录B Visual Studio简要入门教程 395 术语表 398 参考文献 402 ---------------------------C++程序设计:原理与实践(进阶篇)(原书第2版)--------------------------- 出版者的话 译者序 前言 引言 作者简介 第15章 容器和迭代器 1 15.1 存储和处理数据 1 15.1.1 处理数据 1 15.1.2 泛化代码 2 15.2 STL理念 4 15.3 序列和迭代器 7 15.3.1 回到实例 8 15.4 链表 9 15.4.1 链表操作 11 15.4.2 遍历 12 15.5 再次泛化vector 13 15.5.1 遍历容器 15 15.5.2 auto 15 15.6 实例:一个简单的文本编辑器 16 15.6.1 处理行 18 15.6.2 遍历 18 15.7 vector、list和string 21 15.7.1 insert和erase 22 15.8 调整vector类达到STL版本的功能 24 15.9 调整内置数组达到STL版本的功能 26 15.10 容器概览 27 15.10.1 迭代器类别 28 简单练习 29 思考题 30 术语 30 习题 31 附言 32 第16章 算法和映射 33 16.1 标准库算法 33 16.2 最简单的算法find() 34 16.2.1 一些一般的应用 35 16.3 通用搜索算法find_if() 36 16.4 函数对象 38 16.4.1 函数对象的抽象视图 39 16.4.2 类成员上的断言 39 16.4.3 lambda表达式 40 16.5 数值算法 41 16.5.1 累积 42 16.5.2 泛化accumulate() 43 16.5.3 内积 44 16.5.4 泛化inner_product() 45 16.6 关联容器 45 16.6.1 map 46 16.6.2 map概览 47 16.6.3 另一个map实例 50 16.6.4 unordered_map 51 16.6.5 set 53 16.7 拷贝 54 16.7.1 基本拷贝算法 55 16.7.2 流迭代器 55 16.7.3 使用set保持顺序 57 16.7.4 copy_if 57 16.8 排序和搜索 58 16.9 容器算法 60 简单练习 60 思考题 61 术语 62 习题 62 附言 63 第17章 一个显示模型 64 17.1 为什么要使用图形 64 17.2 一个基本显示模型 65 17.3 第一个例子 66 17.4 使用GUI库 68 17.5 坐标系 69 17.6 Shape 70 17.7 使用Shape类 70 17.7.1 图形头文件和主函数 70 17.7.2 一个几乎空白的窗口 71 17.7.3 坐标轴 73 17.7.4 绘制函数图 74 17.7.5 Polygon 75 17.7.6 Rectangle 76 17.7.7 填充 78 17.7.8 Text 78 17.7.9 Image 80 17.7.10 更多未讨论的内容 81 17.8 让图形程序运行起来 81 17.8.1 源文件 82 简单练习 83 思考题 83 术语 83 习题 84 附言 84 第18章 图形类 85 18.1 图形类概览 85 18.2 Point和Line 87 18.3 Lines 88 18.4 Color 91 18.5 Line_style 93 18.6 Open_polyline 95 18.7 Closed_polyline 96 18.8 Polygon 97 18.9 Rectangle 99 18.10 管理未命名对象 102 18.11 Text 104 18.12 Circle 105 18.13 Ellipse 107 18.14 Marked_polyline 108 18.15 Marks 110 18.16 Mark 111 18.17 Image 112 简单练习 114 思考题 115 术语 115 习题 116 附言 116 第19章 设计图形类 117 19.1 设计原则 117 19.1.1 类型 117 19.1.2 操作 118 19.1.3 命名 119 19.1.4 可变性 120 19.2 Shape 121 19.2.1 一个抽象类 122 19.2.2 访问控制 123 19.2.3 绘制形状 125 19.2.4 拷贝和可变性 127 19.3 基类和派生类 128 19.3.1 对象布局 130 19.3.2 类的派生和虚函数的定义 131 19.3.3 覆盖 131 19.3.4 访问 133 19.3.5 纯虚函数 134 19.4 面向对象程序设计的好处 135 简单练习 136 思考题 136 术语 137 习题 137 附言 138 第20章 绘制函数图和数据图 139 20.1 简介 139 20.2 绘制简单函数图 139 20.3 Function 143 20.3.1 默认参数 143 20.3.2 更多例子 144 20.3.3 lambda表达式 146 20.4 Axis 146 20.5 近似 148 20.6 绘制数据图 152 20.6.1 读取文件 153 20.6.2 一般布局 154 20.6.3 数据比例 155 20.6.4 构造数据图 156 简单练习 158 思考题 159 术语 159 习题 159 附言 160 第21章 图形用户界面 161 21.1 用户界面的选择 161 21.2 “Next”按钮 162 21.3 一个简单的窗口 163 21.3.1 回调函数 164 21.3.2 等待循环 166 21.3.3 lambda表达式作为回调函数 166 21.4 Button和其他Widget 167 21.4.1 Widget 167 21.4.2 Button 168 21.4.3 In_box和Out_box 169 21.4.4 Menu 170 21.5 一个实例 170 21.6 控制流反转 173 21.7 添加菜单 174 21.8 调试GUI代码 178 简单练习 179 思考题 179 术语 180 习题 180 附言 181 第22章 理念和历史 182 22.1 历史、理念和专业水平 182 22.1.1 程序设计语言的目标和哲学 182 22.1.2 编程理念 183 22.1.3 风格/范型 188 22.2 程序设计语言历史概览 190 22.2.1 最早的程序设计语言 191 22.2.2 现代程序设计语言的起源 193 22.2.3 Algol家族 197 22.2.4 Simula 203 22.2.5 C 204 22.2.6 C++ 207 22.2.7 今天 209 22.2.8 参考资料 210 思考题 211 术语 212 习题 212 附言 213 第23章 文本处理 214 23.1 文本 214 23.2 字符串 214 23.3 I/O流 217 23.4 映射 218 23.4.1 实现细节 222 23.5 一个问题 224 23.6 正则表达式的思想 225 23.6.1 原始字符串常量 227 23.7 用正则表达式进行搜索 228 23.8 正则表达式语法 229 23.8.1 字符和特殊字符 230 23.8.2 字符集 230 23.8.3 重复 231 23.8.4 子模式 232 23.8.5 可选项 232 23.8.6 字符集和范围 233 23.8.7 正则表达式错误 234 23.9 使用正则表达式进行模式匹配 235 23.10 参考文献 239 简单练习 239 思考题 239 术语 240 习题 240 附言 241 第24章 数值计算 242 24.1 简介 242 24.2 大小、精度和溢出 242 24.2.1 数值限制 245 24.3 数组 245 24.4 C风格的多维数组 246 24.5 Matrix库 247 24.5.1 矩阵的维和矩阵访问 248 24.5.2 一维矩阵 250 24.5.3 二维矩阵 252 24.5.4 矩阵I/O 253 24.5.5 三维矩阵 254 24.6 实例:求解线性方程组 255 24.6.1 经典的高斯消去法 256 24.6.2 选取主元 257 24.6.3 测试 257 24.7 随机数 258 24.8 标准数学函数 261 24.9 复数 262 24.10 参考文献 263 简单练习 264 思考题 264 术语 265 习题 265 附言 266 第25章 嵌入式系统程序设计 267 25.1 嵌入式系统 267 25.2 基本概念 269 25.2.1 可预测性 271 25.2.2 理想 272 25.2.3 生活在故障中 272 25.3 内存管理 274 25.3.1 动态内存分配存在的问题 274 25.3.2 动态内存分配的替代方法 276 25.3.3 存储池实例 277 25.3.4 栈实例 278 25.4 地址、指针和数组 279 25.4.1 未经检查的类型转换 279 25.4.2 一个问题:不正常的接口 280 25.4.3 解决方案:接口类 282 25.4.4 继承和容器 285 25.5 位、字节和字 287 25.5.1 位和位运算 287 25.5.2 bitset 290 25.5.3 有符号数和无符号数 292 25.5.4 位运算 295 25.5.5 位域 296 25.5.6 实例:简单加密 297 25.6 编码规范 301 25.6.1 编码规范应该是怎样的 302 25.6.2 编码原则实例 303 25.6.3 实际编码规范 307 简单练习 308 思考题 308 术语 310 习题 310 附言 311 第26章 测试 312 26.1 我们想要什么 312 26.1.1 警告 313 26.2 程序正确性证明 313 26.3 测试 313 26.3.1 回归测试 314 26.3.2 单元测试 315 26.3.3 算法和非算法 320 26.3.4 系统测试 325 26.3.5 寻找不成立的假设 326 26.4 测试方案设计 327 26.5 调试 328 26.6 性能 328 26.6.1 计时 329 26.7 参考文献 331 简单练习 331 思考题 331 术语 332 习题 332 附言 333 第27章 C语言 334 27.1 C和C++:兄弟 334 27.1.1 C/C++兼容性 335 27.1.2 C不支持的C++特性 336 27.1.3 C标准库 338 27.2 函数 338 27.2.1 不支持函数名重载 338 27.2.2 函数参数类型检查 339 27.2.3 函数定义 340 27.2.4 C++调用C和C调用C++ 341 27.2.5 函数指针 343 27.3 小的语言差异 344 27.3.1 struct标签名字空间 344 27.3.2 关键字 345 27.3.3 定义 345 27.3.4 C风格类型转换 347 27.3.5 无类型指针的转换 347 27.3.6 枚举 348 27.3.7 名字空间 348 27.4 自由存储空间 349 27.5 C风格字符串 350 27.5.1 C风格字符串和const 352 27.5.2 字节操作 352 27.5.3 实例:strcpy() 353 27.5.4 一个风格问题 353 27.6 输入/输出:stdio 354 27.6.1 输出 354 27.6.2 输入 355 27.6.3 文件 356 27.7 常量和宏 356 27.8 宏 357 27.8.1 类函数宏 358 27.8.2 语法宏 359 27.8.3 条件编译 360 27.9 实例:侵入式容器 360 简单练习 365 思考题 365 术语 366 习题 366 附言 367 附录C 标准库概要 368 附录D 安装FLTK 410 附录E GUI实现 413 术语表 419 参考文献 423 |