CSDN论坛 > C/C++ > C++ 语言

读<<C++程序设计语言 特别版>>,第6章的计算器程序有问题 [问题点数:0分]

Bbs2
本版专家分:257
结帖率 100%
CSDN今日推荐
Bbs2
本版专家分:257
Bbs2
本版专家分:257
Bbs2
本版专家分:318
Bbs5
本版专家分:2513
Blank
黄花 2002年11月 专题开发/技术/项目大版内专家分月排行榜第二
Bbs2
本版专家分:257
匿名用户不能发表回复!
其他相关推荐
C++程序设计语言(特别版)--课后习题源代码
提供的是本书的课后习题源代码,也就是《C++程序设计语言(特别版)题解》的源代码。非书中源代码。 本版本是高清版,是第1版第18次印刷,是书签最全最好的版本。 基本信息 原书名: The C++ Programming Language, Special Edition 原出版社: Addison Wesley 作者: (美)Bjarne Stroustrup 译者: 裘宗燕 丛书名: 计算机科学丛书 出版社:机械工业出版社 ISBN:7111102029 上架时间:2002-7-12 出版日期:2002 年7月 页码:936 版次:1-1 内容简介    本书介绍了标准c++以及由c++所支持的关键性编程技术和设计技术。标准c++较以前的版本功能更强大,其中许多新的语言特性,如名字空间、异常、模板、运行时类型声明等使得新技术得以直接应用。本书围绕语言及库功能来组织,内容涉及c++的主要特征及标准库,并通过系统软件领域中的实例解释说明一些关键性的概念与技术。 本书的目的就是帮助读者了解c++是如何支持编程技术的,使读者能从中获得新的理解,从而成为一名优秀的编程人员和设计人员。适合做高校面向对象编程课程的教科书,也可作为c++爱好者的参考书。 [center] [a href=http://www.china-pub.com/main/sale/c++tb.htm target=_blank]c++之父bjarne stroustrup博士专访[/a]    [a href="http://www.is.pku.edu.cn/~qzy/cpp.htm" target="_blank"]《c++程序设计语言》程序的更正和更新[/a]    [a href="http://www.china-pub.com/temporary/list/cooperate/zipdownload/zg.zip" target="_blank"]本书忠告[/a] [/center] 作译者 作者: Bjarne Stroustrup Bjarne Stroustrup现任AT&T实验室的大型程序设计研究部的主管。1990年,Bjarne荣获《财富》杂志评选的“美国12位最年轻的科学家”称号。1993年,由于在C++领域的重大贡献,Bjarne获得了ACM该年度的 Grace Murray Hopper大奖并成为ACM院士(成立于1947年的ACM协会是历史最悠久、目前世界上最大的教育和科学计算协会,成为ACM院士是个人成就的里程碑)。1995年,BYTE杂志颁予他“近20年来计算机工业最具影响力的20人”的称号。 [同作者作品] C++ 程序设计语言(特别版)(英文影印版) C++语言的设计和演化[按需印刷] C++程序设计语言(特别版) 译者: 裘宗燕 知名译者,翻译严谨,喜与读者交流。   裘宗燕教授是北京大学数学学院信息科学系的,关心的主要学术领域包括计算机软件理论、程序设计方法学、程序设计语言和符号计算。已出版多部著作和译著,包括《程序设计语言基础》(译著,1990),《Mathematica数学软件系统的应用与程序设计》(1994),《从问题到程序——程序设计与C语言引论》(1999) [同作者作品] 计算机基础教程(上下)(文科类)(裘宗燕等) 数据结构——C++与面向对象的途径 数据结构--C++与面向对象的途径(修订版) 目录 出版者的话 专家指导委员会 中文版序 译者序 序 第2版序 第1版序 导 论 第1章 致读者 3 1.1 本书的结构 3 1.1.1 例子和参考 4 1.1.2 练习 5 1.1.3 有关实现的注记 5 1.2 学习c++ 6 1.3 c++ 的设计 7 1.3.1 效率和结构 8 1.3.2 哲学注记 9 1.4 历史注记 9 1.5 c++ 的使用 11 1.6 c和c++ 12 .1.6.1 给c程序员的建议 13 1.6.2 给c++程序员的建议 13 1.7 有关在c++里编程的思考 14 1.8 忠告 15 1.9 参考文献 16 第2章 c++概览 19 2.1 为什么是c++ 19 2.2 程序设计范型 19 2.3 过程式程序设计 20 2.3.1 变量和算术 21 2.3.2 检测和循环 22 2.3.3 指针和数组 23 2.4 模块程序设计 23 2.4.1 分别编译 24 2.4.2 异常处理 25 2.5 数据抽象 26 2.5.1 定义类型的模块 27 2.5.2 用户定义类型 28 2.5.3 具体类型 29 2.5.4 抽象类型 31 2.5.5 虚函数 33 2.6 面向对象的程序设计 33 2.6.1 具体类型的问题 33 2.6.2 类层次结构 34 2.7 通用型程序设计 36 2.7.1 容器 36 2.7.2 通用型算法 37 2.8 附言 38 2.9 忠告 39 第3章 标准库概览 40 3.1 引言 40 3.2 hello, world! 40 3.3 标准库名字空间 41 3.4 输出 41 3.5 字符串 42 3.5.1 c风格的字符串 44 3.6 输入 44 3.7 容器 46 3.7.1 向量—vector 46 3.7.2 范围检查 47 3.7.3 表—list 48 3.7.4 映射—map 49 3.7.5 标准容器 49 3.8 算法 50 3.8.1 迭代器的使用 51 3.8.2 迭代器类型 52 3.8.3 迭代器和i/o 53 3.8.4 遍历和谓词 54 3.8.5 使用成员函数的算法 56 3.8.6 标准库算法 56 3.9 数学 57 3.9.1 复数 57 3.9.2 向量算术 57 3.9.3 基本数值支持 58 3.10 标准库功能 58 3.11 忠告 58 第一部分 基本功能 第4章 类型和声明 63 4.1 类型 63 4.1.1 基本类型 64 4.2 布尔量 64 4.3 字符类型 65 4.3.1 字符文字量 66 4.4 整数类型 66 4.4.1 整数文字量 66 4.5 浮点类型 67 4.5.1 浮点文字量 67 4.6 大小 68 4.7 void 69 4.8 枚举 69 4.9 声明 71 4.9.1 声明的结构 72 4.9.2 声明多个名字 73 4.9.3 名字 73 4.9.4 作用域 74 4.9.5 初始化 75 4.9.6 对象和左值 76 4.9.7 typedef 76 4.10 忠告 77 4.11 练习 77 第5章 指针、数组和结构 79 5.1 指针 79 5.1.1 零 80 5.2 数组 80 5.2.1 数组初始化 80 5.2.2 字符串文字量 81 5.3 到数组的指针 83 5.3.1 在数组里漫游 83 5.4 常量 85 5.4.1 指针和常量 87 5.5 引用 88 5.6 指向void的指针 90 5.7 结构 91 5.7.1 类型等价 94 5.8 忠告 94 5.9 练习 94 第6章 表达式和语句 96 6.1 一个桌面计算器 96 6.1.1 分析器 96 6.1.2 输入函数 100 6.1.3 低级输入 102 6.1.4 错误处理 103 6.1.5 驱动程序 104 6.1.6 头文件 104 6.1.7 命令行参数 105 6.1.8 有关风格的注记 106 6.2 运算符概览 107 6.2.1 结果 109 6.2.2 求值顺序 110 6.2.3 运算符优先级 110 6.2.4 按位逻辑运算符 111 6.2.5 增量和减量 112 6.2.6 自由存储 113 6.2.7 显式类型转换 116 6.2.8 构造函数 117 6.3 语句概览 118 6.3.1 声明作为语句 119 6.3.2 选择语句 119 6.3.3 迭代语句 122 6.3.4 goto 123 6.4 注释和缩进编排 123 6.5 忠告 125 6.6 练习 125 第7章 函数 128 7.1 函数声明 128 7.1.1 函数定义 128 7.1.2 静态变量 129 7.2 参数传递 130 7.2.1 数组参数 131 7.3 返回值 132 7.4 重载函数名 133 7.4.1 重载和返回类型 135 7.4.2 重载与作用域 135 7.4.3 手工的歧义性解析 135 7.4.4 多参数的解析 136 7.5 默认参数 137 7.6 未确定数目的参数 138 7.7 指向函数的指针 139 7.8 宏 143 7.8.1 条件编译 145 7.9 忠告 145 7.10 练习 146 第8章 名字空间和异常 148 8.1 模块化和界面 148 8.2 名字空间 150 8.2.1 带限定词的名字 151 8.2.2 使用声明 152 8.2.3 使用指令 153 8.2.4 多重界面 154 8.2.5 避免名字冲突 157 8.2.6 名字查找 159 8.2.7 名字空间别名 159 8.2.8 名字空间组合 160 8.2.9 名字空间和老代码 163 8.3 异常 166 8.3.1 抛出和捕捉 167 8.3.2 异常的辨识 168 8.3.3 在计算器中的异常 169 8.4 忠告 173 8.5 练习 173 第9章 源文件和程序 175 9.1 分别编译 175 9.2 连接 176 9.2.1 头文件 178 9.2.2 标准库头文件 179 9.2.3 单一定义规则 180 9.2.4 与非c++代码的连接 182 9.2.5 连接与指向函数的指针 184 9.3 使用头文件 184 9.3.1 单一头文件 184 9.3.2 多个头文件 187 9.3.3 包含保护符 191 9.4 程序 192 9.4.1 非局部变量的初始化 192 9.5 忠告 194 9.6 练习 194 第二部分 抽象机制 第10章 类 199 10.1 引言 199 10.2 类 199 10.2.1 成员函数 200 10.2.2 访问控制 201 10.2.3 构造函数 202 10.2.4 静态成员 203 10.2.5 类对象的复制 204 10.2.6 常量成员函数 205 10.2.7 自引用 205 10.2.8 结构和类 208 10.2.9 在类内部的函数定义 210 10.3 高效的用户定义类型 210 10.3.1 成员函数 212 10.3.2 协助函数 214 10.3.3 重载的运算符 215 10.3.4 具体类型的意义 215 10.4 对象 216 10.4.1 析构函数 216 10.4.2 默认构造函数 217 10.4.3 构造和析构 218 10.4.4 局部变量 218 10.4.5 自由存储 220 10.4.6 类对象作为成员 221 10.4.7 数组 223 10.4.8 局部静态存储 224 10.4.9 非局部存储 225 10.4.10 临时对象 226 10.4.11 对象的放置 228 10.4.12 联合 229 10.5 忠告 230 10.6 练习 230 第11章 运算符重载 233 11.1 引言 233 11.2 运算符函数 234 11.2.1 二元和一元运算符 235 11.2.2 运算符的预定义意义 236 11.2.3 运算符和用户定义类型 236 11.2.4 名字空间里的运算符 237 11.3 一个复数类型 238 11.3.1 成员运算符和非成员运算符 238 11.3.2 混合模式算术 239 11.3.3 初始化 240 11.3.4 复制 241 11.3.5 构造函数和转换 242 11.3.6 文字量 243 11.3.7 另一些成员函数 243 11.3.8 协助函数 244 11.4 转换运算符 245 11.4.1 歧义性 246 11.5 友元 248 11.5.1 友元的寻找 249 11.5.2 友元和成员 250 11.6 大型对象 251 11.7 基本运算符 253 11.7.1 显式构造函数 253 11.8 下标 255 11.9 函数调用 256 11.10 间接 257 11.11 增量和减量 259 11.12 一个字符串类 260 11.13 忠告 265 11.14 练习 265 第12章 派生类 268 12.1 引言 268 12.2 派生类 269 12.2.1 成员函数 271 12.2.2 构造函数和析构函数 272 12.2.3 复制 273 12.2.4 类层次结构 273 12.2.5 类型域 274 12.2.6 虚函数 276 12.3 抽象类 278 12.4 类层次结构的设计 280 12.4.1 一个传统的层次结构 280 12.4.2 抽象类 283 12.4.3 其他实现方式 285 12.4.4 对象创建的局部化 287 12.5 类层次结构和抽象类 289 12.6 忠告 289 12.7 练习 289 第13章 模板 292 13.1 引言 292 13.2 一个简单的string模板 293 13.2.1 定义一个模板 294 13.2.2 模板实例化 295 13.2.3 模板参数 296 13.2.4 类型等价 296 13.2.5 类型检查 297 13.3 函数模板 298 13.3.1 函数模板的参数 299 13.3.2 函数模板的重载 300 13.4 用模板参数描述策略 302 13.4.1 默认模板参数 303 13.5 专门化 304 13.5.1 专门化的顺序 306 13.5.2 模板函数的专门化 307 13.6 派生和模板 308 13.6.1 参数化和继承 309 13.6.2 成员模板 310 13.6.3 继承关系 311 13.7 源代码组织 312 13.8 忠告 314 13.9 练习 314 第14章 异常处理 316 14.1 错误处理 316 14.1.1 关于异常的其他观点 318 14.2 异常的结组 318 14.2.1 派生的异常 319 14.2.2 多个异常的组合 321 14.3 捕捉异常 321 14.3.1 重新抛出 322 14.3.2 捕捉所有异常 322 14.4 资源管理 324 14.4.1 构造函数和析构函数的使用 325 14.4.2 auto_ptr 326 14.4.3 告诫 328 14.4.4 异常和new 328 14.4.5 资源耗尽 329 14.4.6 构造函数里的异常 331 14.4.7 析构函数里的异常 332 14.5 不是错误的异常 333 14.6 异常的描述 334 14.6.1 对异常描述的检查 335 14.6.2 未预期的异常 336 14.6.3 异常的映射 336 14.7 未捕捉的异常 338 14.8 异常和效率 339 14.9 处理错误的其他方式 340 14.10 标准异常 342 14.11 忠告 344 14.12 练习 344 第15章 类层次结构 346 15.1 引言和概述 346 15.2 多重继承 346 15.2.1 歧义性解析 348 15.2.2 继承和使用声明 349 15.2.3 重复的基类 350 15.2.4 虚基类 352 15.2.5 使用多重继承 354 15.3 访问控制 357 15.3.1 保护成员 359 15.3.2 对基类的访问 360 15.4 运行时类型信息 361 15.4.1 dynamic_cast 363 15.4.2 在类层次结构中漫游 365 15.4.3 类对象的构造与析构 367 15.4.4 typeid和扩展的类型信息 368 15.4.5 rtti的使用和误用 370 15.5 指向成员的指针 371 15.5.1 基类和派生类 373 15.6 自由存储 374 15.6.1 数组分配 375 15.6.2 虚构造函数 376 15.7 忠告 377 15.8 练习 377 第三部分 标 准 库 第16章 库组织和容器 381 16.1 标准库的设计 381 16.1.1 设计约束 382 16.1.2 标准库组织 383 16.1.3 语言支持 385 16.2 容器设计 386 16.2.1 专门化的容器和迭代器 386 16.2.2 有基类的容器 388 16.2.3 stl容器 391 16.3 向量 392 16.3.1 类型 393 16.3.2 迭代器 394 16.3.3 元素访问 395 16.3.4 构造函数 396 16.3.5 堆栈操作 399 16.3.6 表操作 401 16.3.7 元素定位 403 16.3.8 大小和容量 404 16.3.9 其他成员函数 406 16.3.10 协助函数 406 16.3.11 vector[bool] 407 16.4 忠告 407 16.5 练习 408 第17章 标准容器 409 17.1 标准容器 409 17.1.1 操作综述 409 17.1.2 容器综述 412 17.1.3 表示 413 17.1.4 对元素的要求 413 17.2 序列 416 17.2.1 向量—vector 416 17.2.2 表—list 416 17.2.3 双端队列—deque 420 17.3 序列适配器 421 17.3.1 堆栈—stack 421 17.3.2 队列—queue 422 17.3.3 优先队列—priority_queue 423 17.4 关联容器 425 17.4.1 映射—map 425 17.4.2 多重映射—multimap 433 17.4.3 集合—set 434 17.4.4 多重集合—multiset 435 17.5 拟容器 435 17.5.1 串—string 435 17.5.2 值向量—valarray 435 17.5.3 位集合—bitset 435 17.5.4 内部数组 439 17.6 定义新容器 439 17.6.1 散列映射—hash_map 440 17.6.2 表示和构造 441 17.6.3 其他散列关联容器 446 17.7 忠告 446 17.8 练习 446 第18章 算法和函数对象 449 18.1 引言 449 18.2 标准库算法综述 449 18.3 序列和容器 453 18.3.1 输入序列 453 18.4 函数对象 454 18.4.1 函数对象的基类 456 18.4.2 谓词 456 18.4.3 算术函数对象 458 18.4.4 约束器、适配器和否定器 458 18.5 非修改性序列算法 463 18.5.1 对每个做—for_each 463 18.5.2 查找族函数 464 18.5.3 计数 465 18.5.4 相等和不匹配 466 18.5.5 搜索 467 18.6 修改性序列算法 467 18.6.1 复制 468 18.6.2 变换 469 18.6.3 惟一化 471 18.6.4 取代 473 18.6.5 删除 474 18.6.6 填充和生成 474 18.6.7 反转和旋转 475 18.6.8 交换 476 18.7 排序的序列 476 18.7.1 排序 476 18.7.2 二分检索 477 18.7.3 归并 478 18.7.4 划分 479 18.7.5 序列上的集合运算 479 18.8 堆 480 18.9 最小和最大 481 18.10 排列 482 18.11 c风格算法 482 18.12 忠告 483 18.13 练习 483 第19章 迭代器和分配器 485 19.1 引言 485 19.2 迭代器和序列 485 19.2.1 迭代器的操作 486 19.2.2 迭代器特征类—iterator_traits 487 19.2.3 迭代器类别 488 19.2.4 插入器 490 19.2.5 反向迭代器 491 19.2.6 流迭代器 492 19.3 带检查迭代器 495 19.3.1 异常、容器和算法 499 19.4 分配器 500 19.4.1 标准分配器 500 19.4.2 一个用户定义分配器 503 19.4.3 广义的分配器 505 19.4.4 未初始化的存储 506 19.4.5 动态存储 508 19.4.6 c风格的分配 509 19.5 忠告 510 19.6 练习 510 第20章 串 511 20.1 引言 511 20.2 字符 511 20.2.1 字符特征类—char_traits 512 20.3 基础串类—basic_string 513 20.3.1 类型 514 20.3.2 迭代器 515 20.3.3 元素访问 516 20.3.4 构造函数 516 20.3.5 错误 517 20.3.6 赋值 518 20.3.7 到c风格字符串的转换 519 20.3.8 比较 521 20.3.9 插入 522 20.3.10 拼接 523 20.3.11 查找 524 20.3.12 替换 525 20.3.13 子串 526 20.3.14 大小和容量 527 20.3.15 i/o操作 527 20.3.16 交换 528 20.4 c标准库 528 20.4.1 c风格字符串 528 20.4.2 字符分类 530 20.5 忠告 530 20.6 练习 531 第21章 流 533 21.1 引言 533 21.2 输出 534 21.2.1 输出流 535 21.2.2 内部类型的输出 536 21.2.3 用户定义类型的输出 538 21.3 输入 540 21.3.1 输入流 540 21.3.2 内部类型的输入 540 21.3.3 流状态 542 21.3.4 字符的输入 544 21.3.5 用户定义类型的输入 546 21.3.6 异常 547 21.3.7 流的联结 548 21.3.8 哨位 549 21.4 格式化 550 21.4.1 格式状态 550 21.4.2 整数输出 552 21.4.3 浮点数输出 552 21.4.4 输出域 553 21.4.5 域的调整 555 21.4.6 操控符 555 21.5 文件流与字符串流 560 21.5.1 文件流 561 21.5.2 流的关闭 562 21.5.3 字符串流 563 21.6 缓冲 564 21.6.1 输出流和缓冲区 565 21.6.2 输入流和缓冲区 566 21.6.3 流和缓冲区 567 21.6.4 流缓冲区 567 21.7 现场 571 21.7.1 流回调 572 21.8 c输入/输出 573 21.9 忠告 575 21.10 练习 576 第22章 数值 578 22.1 引言 578 22.2 数值的限制 578 22.2.1 表示限制的宏 580 22.3 标准数学函数 580 22.4 向量算术 582 22.4.1 valarray的构造 582 22.4.2 valarray的下标和赋值 583 22.4.3 成员操作 584 22.4.4 非成员函数 586 22.4.5 切割 587 22.4.6 切割数组—slice_array 589 22.4.7 临时量、复制和循环 593 22.4.8 广义切割 595 22.4.9 屏蔽 596 22.4.10 间接数组—indirect_array 596 22.5 复数算术 597 22.6 通用数值算法 599 22.6.1 累积—accumulate 599 22.6.2 内积—inner_product 600 22.6.3 增量变化 600 22.7 随机数 602 22.8 忠告 603 22.9 练习 603 第四部分 用c++ 做设计 第23章 开发和设计 607 23.1 概述 607 23.2 引言 607 23.3 目的与手段 609 23.4 开发过程 611 23.4.1 开发循环 613 23.4.2 设计目标 615 23.4.3 设计步骤 616 23.4.4 试验和分析 623 23.4.5 测试 625 23.4.6 软件维护 625 23.4.7 效率 626 23.5 管理 626 23.5.1 重用 627 23.5.2 规模 628 23.5.3 个人 629 23.5.4 混成设计 630 23.6 带标注的参考文献 631 23.7 忠告 633 第24章 设计和编程 635 24.1 概述 635 24.2 设计和程序设计语言 635 24.2.1 忽视类 637 24.2.2 忽视继承 638 24.2.3 忽视静态类型检查 638 24.2.4 忽视程序设计 641 24.2.5 排他性地使用类层次结构 642 24.3 类 643 24.3.1 类表示什么 643 24.3.2 类层次结构 644 24.3.3 包容关系 648 24.3.4 包容和继承 649 24.3.5 使用关系 653 24.3.6 编入程序里的关系 654 24.3.7 类内的关系 656 24.4 组件 661 24.4.1 模板 663 24.4.2 界面和实现 665 24.4.3 肥大的界面 667 24.5 忠告 668 第25章 类的作用 670 25.1 类的种类 670 25.2 具体类型 672 25.2.1 具体类型的重用 672 25.3 抽象类型 674 25.4 结点 676 25.4.1 修改界面 677 25.5 动作 680 25.6 界面类 681 25.6.1 调整界面 683 25.7 句柄类 684 25.7.1 句柄上的操作 687 25.8 应用框架 688 25.9 忠告 689 25.10 练习 690 附录和索引 附录a 语法 695 附录b 兼容性 713 附录c 技术细节 724 附录d 现场 759 附录e 标准库的异常时安全性 815 索引 845 译者序    Bjarne Stroustrup的《The C++ Programming Language》是有关C++语言的第一部著作。毫无疑问,它是关于C++语言及其程序设计的最重要著作,在此领域中的地位是无可替代的。《The C++ Programming Language》一书伴随着C++语言的发展演化而不断进步,经过第1版(1985年)、第2版(1991年),第3版(1998年),本书的英文原书是《The C++ Programming Language》第3版经过补充和修订后的“特别版(2000)”(对应于国内引进的影印本)。对于这个中译本,我想说的第一句话就是“来得太晚了”。   要学习C++语言和程序设计,要将C++应用于程序设计实践,本书自然是必读之书。这个“特别版”以标准化的C++语言为基础,讨论了C++的各种语言特征和有效使用这一语言的程序设计技术。书中也用了大量的篇幅,在标准库以及一般软件开发的环境下,讨论了使用C++语言编程和组织程序的许多高级技术。本书内容覆盖了C++语言及其程序设计的各个方面,其技术深度与广度是举世公认的。   然而,作者讨论的并不仅是C++语言及其程序设计。本书的讨论远远超出这一范围,第四部分用了大量的篇幅去讨论软件开发过程及其问题。即使是在介绍C++语言及其程序设计的具体问题时,作者也常在程序结构、设计和软件开发的大环境下,提出自己的许多认识。作者有很强的计算机科学与技术基础,在系统软件开发方面极富经验,他所提出的观点和意见值得每个在这个领域中工作的人的重视。 当然,重视并不是盲从。在Stroustrup的两本关于C++的重要著作(本书和《C++语言的设计与演化》(已由机械工业版社出版))中,都有这样一句话使我印象深刻:希望读者带着一种健康的怀疑态度。看来这是作者深深铭刻在心的一种思想,也特别值得国内每个从事信息技术,或者努力向这个方向发展的人注意。从来就没有什么救世主,Stroustrup不是在传道,他只是在总结和论述自己在这个领域中工作的经验。请不要将本书中的东西作为教条,那也一定是本书作者所深恶痛绝的。   许多人说本书比较难读,这种说法有一定道理。真正理解本书的一般性内容需要花一些时间,融会贯通则更需要下功夫。理解本书的内容不仅需要去读它,还需要去实践。问题是,花这个时间值吗?作者在讨论C++语言的设计时提出了一个观点:你从C++语言中的收获大致与在学习实践这个语言的过程中所付出的努力成正比;而且C++是一个可以伴随你成长的语言。同样的话也适用于本书。如果你致力于将自己发展成一个职业的程序员,或者要在计算机方面的技术领域中长期工作下去,我认为,你从本书中的收获大致也会与你所花的时间成正比,这本书也是一本能够伴随你成长的书。   当然,这本书也不是没有缺陷的。由于作者有着极其丰富的实践经验,因此,当他想要论述一个问题、提出一个观点时,常会想到在自己长期实践中最适合说明这个问题的示例,用几句简短的话引述有关的情况。由于作者对C++谙练有加,因此,在讨论中有时会不知不觉地将某些并不显然的东西当作不言自明的事情提出来。而对于许多初学者而言,这些都可能成为学习中的障碍。为了帮助这部分读者,我也在书中一些地方加入了少量注释,解释一些背景性情况。过多过滥的注释会增大书的篇幅,干扰读者阅读,绝不会是大家都喜欢的方式。因此我在这样做的时候也很有节制,希望不会引起读者的反感。   由于读者的水平有极大差异,对一些人很熟的东西,对另一些人可能就会莫名其妙。我无法解决所有问题,但也希望能为广大读者做一点服务性的工作(谁让我翻译了这本书呢!)。为了帮助初学者入门,为使本书(包括其中文译本)能更好地在国内计算机领域中发挥作用,也为了关心本书、学习本书的人们能够有一个交流经验、传播认识的场所,我将在下面地址维护一个有关本书的信息、情况、认识和意见的网页:   http://www.math.pku.edu.cn/teachers/qiuzy/cpp.htm   在其中收集有关的信息,记录朋友们(包括我自己)的认识与意见,提出的问题和相应的认识,有关这一译本的勘误信息,原英文书的更正与更新信息等。欢迎诸位提供自己的见解和问题,提供有价值的线索。我没时间去创建与维护一个“纯的”C++语言及其程序设计的讨论组(确实需要这样的场所,而有关VC等的讨论组倒是太多了。如果有人愿做,我乐得坐享其成、积极参与并尽可能提供帮助),只想抽空将接收到的和自己写的东西编辑公布。与我联系可以给我发email:qzy@math.pku.edu.cn。我还将把有关《C++语言的设计与演化》一书的相关信息也放在那里,供大家参考。   还请读者注意,本书的英文原版书是“特别版”的第1次印刷,即“第3版”的第11次印刷,也是目前国内可买到的影印本的原书。在那以后,作者在重印时不断更正书中的错误,并修改了少量的程序示例。最新的重印是第16次印刷,有关情况可从作者的网页或上面网址找到。由于一些情况,本书无法按最新的重印本翻译,但我还是参考了作者的网页,在译文中尽可能地采纳了有关勘误信息。此外,在翻译过程中我也发现了一些错误。经与作者通过电子邮件讨论取得了一致意见,有关更正反映在本书里。由于这些原因,本书在个别地方的说法可能与读者手头的英文原书有异。如果想确认有关情况,请查看原书的勘误信息。   裘宗燕   2002年2月于北京大学数学学院信息科学系    序言    去编程就是去理解。    —Kristen Nyggard    我觉得用C++ 编程序比以往更令人感到愉快。在过去这些年里,C++ 在支持设计和编程方面取得了令人振奋的进步,针对其使用的大量新技术已经被开发出来了。然而,C++ 并不就是好玩。普通的实际程序员在几乎所有种类和规模的开发项目上,在生产率、可维护性、灵活性和质量方面都取得了显著的进步。到今天为止,C++ 已经实现了我当初对它的期望中的绝大部分,还在许多我原来根本没有梦想过的工作中取得了成功。    本书介绍的是标准C++以及由C++ 所支持的关键性编程技术和设计技术。与本书第1版所介绍的那个C++ 版本相比,标准C++ 是一个经过了更仔细推敲的更强大的语言。各种新的语言特征,如名字空间、异常、模板,以及运行时类型识别,使人能以比过去更直接的方式使用许多技术,标准库使程序员能够从比基本语言高得多的层面上起步。    本书第2版中大约有三分之一的内容来自第1版。这个第3版则是重写了比例更大的篇幅的结果。它提供的许多东西是大部分有经验的程序员也需要的,与此同时,本书也比它的以前版本更容易供新手入门。C++ 使用的爆炸性增长和作为其结果的海量经验积累使这些成为可能。    一个功能广泛的标准库定义使我能以一种与以前不同的方式介绍C++ 的各种概念。与过去一样,本书对C++ 的介绍与任何特定的实现都没有关系;与过去一样,教材式的各章还是采用“自下而上”的方式,使每种结构都是在定义之后才使用。无论如何,使用一个设计良好的库远比理解其实现细节容易得多。由于这些情况,在假定读者已经理解了标准库的内部工作原理之前,就可以利用它提供许多更实际更有趣的例子。标准库本身也是程序设计实例和设计技术的丰富源泉。    本书将介绍每种主要的C++ 语言特征和这个标准库,它是围绕着语言和库功能组织起来的。当然,各种特征都将在使用它们的环境中介绍。也就是说,这里所关注的是将语言作为一种设计和编程的工具,而不是语言本身。本书将展示那些使C++ 卓有成效的关键性技术,讲述为掌握它们所需要的那些基本概念。除了专门阐释技术细节的那些地方之外,其他示例都取自系统软件领域。另一本与本书配套出版的书《带标注的C++ 语言标准》(The Annotated C++ Language Standard),将给出完整的语言定义,所附标注能使它更容易理解。    本书的基本目标就是帮助读者理解C++ 所提供的功能将如何支持关键性的程序设计技术。这里的目标是使读者能远远超越简单地复制示例并使之能够运行,或者模仿来自其他语言的程序设计风格。只有对隐藏在语言背后的思想有了一个很好的理解之后,才能真正掌握这个语言。如果有一些具体实现的文档的辅助,这里所提供的信息就足以对付具有挑战性的真实世界中的重要项目。我的希望是,本书能帮助读者获得新的洞察力,使他们成为更好的程序员和设计师。    致谢    除了第1版和第2版的致谢中所提到的那些人之外,我还要感谢Matt Austern,Hans Boehm,Don Caldwell,Lawrence Crowl,Alan Feuer,Andrew Forrest,David Gay,Tim Griffin,Peter Juhl,Brian Kernighan,Andrew Koenig,Mike Mowbray,Rob Murray,Lee Nackman,Joseph Newcomer,Alex Stepanov,David Vandevoorde,Peter Weinberger和Chris Van Wyk,他们对第3版各章的初稿提出了许多评论和意见。没有他们的帮助和建议,这本书一定会更难理解,包含更多的错误,没有这么完全,当然也可能稍微短一点。    我还要感谢C++ 标准化委员会的志愿者们,是他们完成了规模宏大的建设性工作,才使C++ 具有它今天这个样子。要罗列出每个人就会有一点不公平,但一个也不提就更不公平,所以我想特别提出Mike Ball,Dag Br焎k,Sean Corfield,Ted Goldstein,Kim Knuttila,Andrew Koenig,Jos?Lajoie,Dmitry Lenkov,Nathan Myers,Martin O'Riordan,Tom Plum,Jonathan Shopiro,John Spicer, Jerry Schwarz,Alex Stepanov和Mike Vilot,他们中的每个都在C++及其标准库的某些方面直接与我合作过。    在这本书第一次印刷之后,许多人给我发来电子邮件,提出更正和建议。我已经在原书的结构里响应了他们的建议,使后来出版的版本大为改善。将本书翻译到各种语言的译者也提供了许多澄清性的意见。作为对这些读者的回应,我增加了附录D和附录E。让我借这个机会感谢他们之中特别有帮助的几位:Dave Abrahams,Matt Austern,Jan Bielawski,Janina Mincer Daszkiewicz,Andrew Koenig,Dietmar K焗l,Nicolai Josuttis,Nathan Myers,Paul E. Sevinc,Andy Tenne-Sens,Shoichi Uchida,Ping-Fai(Mike) Yang和Dennis Yelle。    Bjarne Stroustrup   Murray Hill,新泽西    第2版序    前路漫漫。    —Bilbo Baggins    正如在本书的第1版所承诺的,C++ 为满足其用户的需要正在不断地演化。这一演化过程得助于许多有着极大的背景差异,在范围广泛的应用领域中工作的用户们的实际经验的指导。在第1版出版后的六年中,C++ 的用户群体扩大了不只百倍,人们学到了许多东西,发现了许多新技术并通过了实践的检验。这些技术中的一些也在这一版中有所反映。    在过去六年里所完成的许多语言扩展,其基本宗旨就是将C++ 提升成为一种服务于一般性的数据抽象和面向对象程序设计的语言,特别是提升为一个可编写高质量的用户定义类型库的工具。一个“高质量的库”是指这样的库,它以一个或几个方便、安全且高效的类的形式,给用户提供了一个概念。在这个环境中,安全意味着这个类在库的使用者与它的供方之间构成了一个特殊的类型安全的界面;高效意味着与手工写出的C代码相比,这种库的使用不会给用户强加明显的运行时间上或空间上的额外开销。    本书介绍的是完整的C++ 语言。从第1章到第10章是一个教材式的导引,第11章到第13章展现的是一个有关设计和软件开发问题的讨论,最后包含了完整的C++ 参考手册。自然,在原来版本之后新加入的特征和变化已成为这个展示的有机组成部分。这些特征包括:经过精化后的重载解析规则和存储管理功能,以及访问控制机制、类型安全的连接、const和static成员函数、抽象类、多重继承、模板和异常处理。 .   C++ 是一个通用的程序设计语言,其核心应用领域是最广泛意义上的系统程序设计。此外,C++ 还被成功地用到许多无法称为系统程序设计的应用领域中。从最摩登的小型计算机到最大的超级计算机上,以及几乎所有操作系统上都有C++ 的实现。因此,本书描述的是C++ 语言本身,并不想试着去解释任何特殊的实现、程序设计环境或者库。    本书中给出的许多类的示例虽然都很有用,但也还是应该归到“玩具”一类。与在完整的精益求精的程序中做解释相比,这里所采用的解说风格能更清晰地呈现那些具有普遍意义的原理和极其有用的技术,在实际例子中它们很容易被细节所淹没。这里给出的大部分有用的类,如链接表、数组、字符串、矩阵、图形类、关联数组等,在广泛可用的各种商品的和非商品资源中,都有可用的“防弹”和/或“金盘”版本。那些“具有工业强度”的类和库中的许多东西,实际上不过是在这里可以找到的玩具版本的直接或间接后裔。    与本书的第1版相比,这一版更加强调本书的教学方面的作用。然而,这里的叙述仍然是针对有经验的程序员,并努力不去轻视他们的智慧和经验。有关设计问题的讨论有了很大的扩充,作为对读者在语言特征及其直接应用之外的要求的一种回应。技术细节和精确性也有所增强。特别是,这里的参考手册表现了在这个方向上多年的工作。我的目标是提供一本具有足够深度的书籍,使大部分程序员能在多次阅读中都有所收获。换句话说,这本书给出的是C++ 语言,它的基本原理,以及使用时所需要的关键性技术。欢迎欣赏!    致谢    除了在第1版序中致谢里所提到人们之外,我还要感谢Al Aho,Steve Buroff,Jim Coplien,Ted Goldstein,Tony Hansen,Lorraine Juhl,Peter Juhl, Brian Kernighan,Andrew Koenig,Bill Leggett,Warren Montgomery,Mike Mowbray,Rob Murray,Jonathan Shopiro,Mike Vilot和Peter Weinberger,他们对第2版的初稿提出了许多意见。许多人对C++从1985年到1991年的开发有很大影响,我只能提出其中几个:Andrew Koenig,Brian Kernighan,Doug McIlroy和Johathan Shopiro。还要感谢参考手册“外部评阅”的许多参与者,以及在X3J16的整个第一年里一直在其中受苦的人们。    Bjarne Stroustrup Murray Hill,新泽西    第1 版序    语言磨砺了我们思维的方式,也决定着我们思考的范围。    —B.L. Whorf    C++ 是一种通用的程序设计语言,其设计就是为了使认真的程序员工作得更愉快。除了一些小细节之外,C++ 是C程序设计语言的一个超集。C++ 提供了C所提供的各种功能,还为定义新类型提供了灵活而有效的功能。程序员可以通过定义新类型,使这些类型与应用中的概念紧密对应,从而把一个应用划分成许多容易管理的片段。这种程序构造技术通常被称为数据抽象。某些用户定义类型的对象包含着类型信息,这种对象就可以方便而安全地用在那种对象类型无法在编译时确定的环境中。使用这种类型的对象的程序通常被称为是基于对象的。如果用得好,这些技术可以产生出更短、更容易理解,而且也更容易管理的程序。    C++ 里的最关键概念是类。一个类就是一个用户定义类型。类提供了对数据的隐藏,数据的初始化保证,用户定义类型的隐式类型转换,动态类型识别,用户控制的存储管理,以及重载运算符的机制等。在类型检查和表述模块性方面,C++提供了比C好得多的功能。它还包含了许多并不直接与类相关的改进,包括符号常量、函数的在线替换、默认函数参数、重载函数名、自由存储管理运算符,以及引用类型等。C++ 保持了C高效处理硬件基本对象(位、字节、字、地址等)的能力。这就使用户定义类型能够在相当高的效率水平上实现。    C++ 及其标准库也是为了可移植性而设计的。当前的实现能够在大多数支持C的系统上运行。C的库也能用于C++ 程序,而且大部分支持C程序设计的工具也同样能用于C++。    本书的基本目标就是帮助认真的程序员学习这个语言,并将它用于那些非平凡的项目。书中提供了有关C++ 的完整描述,许多完整的例子,以及更多的程序片段。    致谢    如果没有许多朋友和同事持之以恒的使用、建议和建设性的批评,C++ 绝不会像它现在这样成熟。特别地,Tom Cargill,Jim Coplien,Stu Feldman,Sandy Fraser,Steve Johnson,Brian Kernighan,Bart Locanthi,Doug McIlroy,Dennis Rechie,Larry Rosler,Jerry Schwarz和Jon Shopiro对语言发展提供了重要的思想。Dave Presotto写出了流I/O库的当前实现。    此外,还有成百的人们对C++ 及其编译器的开发做出了贡献:他们给我提出改进的建议,描述他们所遇到的问题,告诉我编译中的错误等。我只能提出其中的很少几位:Gary Bishop,Abdrew Hume,Tom Karzes,Victor Milenkovic,Rob Murray,Leonie Rose,Brian Schmult和Gary Walker。    许多人在本书的撰写过程中为我提供了帮助,特别值得提出的是Jon Bentley,Laura Eaves,Brian Kernighan,Ted Kowalski,Steve Mahaney,Jon Shopiro,以及参加1985年7月26 ~ 27日俄亥俄州哥伦布贝尔实验室C++ 课程的人们。    Bjarne Stroustrup   Murray Hill, 新泽西    中文版序    本书是讲述标准C++的最完整和最新的著作,它拥有最多的读者,使用也最为广泛。按我目前的统计,本书已经被翻译成17种语言(参见http://WWW.research.att.com/~bs/covers.html)。所以,这个译本所依据的原文,已经从成千上万的读者建议中获益匪浅。    现在,中国的程序员和事事学子能够更容易地读到本书,对此我尤感欣慰。我的中国同事,还有许许多多中国的程序员(通过电子邮件)早就向我建议有必要将本书译为中文。因为自己的母语也不是英语,我当然也认识到了这种必要性--何况,我还非常喜欢拿本书译本的总数作为C++得到广泛应用的活生生的例子。    自然了,所谓"仁者乐山,智者乐水",有人会更喜欢英文原版,而另一些人则会感觉阅读翻译成母语的版本更能消除理解上的障碍。我认识许多程序员同时使用原版和译本,这样既能发挥母语的优势,又能用英语与全世界的程序员进行交流。    本书涵盖了标准C++、它的标准库和C++所支持的基本技术,如面向对象程序设计和通用型程序设计。其目的不仅仅是阐述语言的功能,还要提供如何行之有效地使用这些功能的信息,使程序员足以应付大多数开发项目。因此其中对设计的讨论非常重要。    1998年,ISO的C++标准(ISO/IEC 14882 Standond for the C++ Programming Language)得到了批准(各国标准委员会以22-0全票通过)。这是C++发展史上的一个里程碑,开创了C++工具和技术稳定发展的新纪元。    对我本人而言,其中关键在于,标准C++相对于以前的任何版本,更接近于我对C++的目标。标准C++及其标准库使我能够编写出比过去更好、更优雅、更高效的C++程序。    标准化的目的是为一种语言和一个库制定规范,使其能够服务于所有用户群体,而不至偏向于某个用户群、某个公司或某个国家。这是一个以保证质量和达成共识为目的的开放。公正的过程。    开放和民主的标准化过程存在~个潜在的问题:所谓"由委员会设计"。这在C++的标准化中基本上被避免了。原因之一在于,我担任了语言扩展工作组的主席。在此位置上,我负责评估所有关于主要语言扩展方面的建议,并就那些我本人、工作组和委员会都认为值得和可行的建议撰写最终版本。因此,委员会的主要活动是讨论提交上来的相对完整的设计,而不是自己来设计。与此类似,标准库的主要新增部分--"STL"(为容器、迭代器和算法提供了通用的、高效的、类型安全的和可扩展的框架),主要都源自一个人-Alexander stepanov的工作成果。    重要的是,C++标准不仅仅是一份文档。它已经在各种C+十实现产品中得到了体现。所有主要的C++实现产品现在都实现了标准,只有极少的几个例外。为了帮助厂商更好地实现标准,现在至少有两个公司提供了标准C++的验证套件。因此,我现在写代码,只要合适,都会用到标准C++提供的和本书这一版中讲述的功能。    C++语言的改进和标准库的增加,使我自己编写代码的方式发生了显著变化。现在我的程序比原来更加简洁、更加高效。这直接得益于标准C++对抽象更好、更系统和更纯粹的支持。    对模板和异常等功能更好的支持,使对底层处理和更混乱的功能的需要大大降低了。而且,最近几年出现了许多新的设计和编程技术,这在本书的表达方法和实例中都有所反映。    C++现在可以作为高级语言来讲授了。也就是说,重点一开始就可以放在算法和容器上,而不用再在什么位呀,联合呀,C风格字符串,数组等等东西上纠缠不清了。自然,底层的概念(如数组、重要的指针应用和强制转换)最终还是要教要学的。但是,可以等到作为新手的C++程序员、读者或学生已经成熟,能够在实现这些功能的高级概念的大背景中看待它们的时候,再对这些功能进行阐释。    我想特别强调(怎么强调都不过分)的是,应该多使用静态类型安全的字符串和容器,而不要学那些使用大量宏、强制转换和数组的编程风格。在本书中,我能够根本就不用宏,并且只在很少的非用不可的情况下才使用强制转换。我认为C/C++形式的宏是一种严重的缺陷--现在因为有了模板、名字空间、在线函数和常量这些正确的语言功能,它很大程度上更是一种多余了。同样,在任何语言中,强制转换的大量使用都是设计不良的标志。宏和强制转换是错误的主要渊薮。不用它们也能工作,这一点大大提高了C++编程的安全性和优雅性。    标准C++改变了我们使用C++编程、设计程序以及教授C++编程的方式。这些变化不可能"毕其功于一役"。我鼓励你在标准C++、在本书中所用的设计和编程技术,以及自己的编程方式上好好下一番功夫。我想脱胎换骨是有可能的。但是别太死心眼了。奇迹是不存在的,在产品代码中使用仅仅一知半解的语言功能和技术是相当危险的。现在该开始探索,开始试验了--标准C++真正对你有所种益的地方,就在理解新概念和新技术的旅程中!    旅途愉快!    Bjarne Stroustrup      
《C++程序设计语言(十周年纪念版)》【PDF】
下载地址:https://page81.ctfile.com/fs/3990681-206327808内容简介《C++程序设计语言特别版 十周年纪念版》是在c++语言和程序设计领域具有深远影响、畅销不衰的著作,由c++语言的设计者编写,对c++语言进行了最全面、最权威的论述,覆盖标准c++以及由c++所支持的关键性编程技术和设计技术。本书英文原版一经面世,即引起业内人士的高度评价和热烈欢迎,先后被...
C++程序设计语言特别版(中文版) The C++ Programming Language S 英文高清完整PDF版
知子莫若父 C++程序设计语言特别版(中文版) (pdg) &&The; C++ Programming Language Special 3rd Edition(pdf) (中文版+原版)
C程序设计语言(第2版 新版) 带书签目录及习题解答
包含C程序设计语言(第2版 新版) 带书签目录,另外还有配套的习题解答一书的pdf。 《C程序设计语言第二版·新版》是2004年01月机械工业出版社出版的图书,作者是(美)克尼汉 、(美)里奇、 徐宝文、 李志。 本书是由C语言的设计者Brian W. Kernighan和Dennis M. Ritchie编写的一部介绍标准C语言及其程序设计方法的权威性经典著作。全面、系统地讲述了C语言的各个特性及程序设计的基本方法,包括基本概念、类型和表达式、控制流、函数与程序结构、指针与数组、结构、输入与输出、UNIX系统接口、标准库等内容。 目录: 出版者的话 专家指导委员会 中文版序 译者序 校译者简介 序 第1版序 引言 第1章 导言 1.1 入门 1.2 变量与算术表态式 1.3 for语句 1.4 符号常量 1.5 字符输入/输出 1.6 数组 1.7 函数 1.8 参数——传值调用 1.9 字符数组 1.10 外部变量与作用域 第2章 类型、运算符与表达式 2.1 变量名 2.2 数据类型及长度 2.3 常量 2.4 声明 2.5 算术运算符 2.6 关系运算符与逻辑运算符 2.7 类型转换 2.8 自增运算符与自减运算符 2.9 按位运算符 2.10 赋值运算符与表达式 2.11 条件表达式 2.12 运算符优先级与求值次序 第3章 控制流 3.1 语句与程序块 3.2 if-else语句 3.3 else-if语句 3.4 switch语句 3.5 whil循环与for特环 3.6 do-while循环 3.7 break语句与continue语句 3.8 goto语句与标号 第4章 涵数与程序结构 第5章 指针与数组 第6章 结构 第7章 输入与输出 第8章 UNIX系统接口 附录A 参考手册 附录B 标准库 附录C 变更小结 索引
K&R的《C程序设计语言》第二版中文版,高清带目录PDF格式
K&R的《C程序设计语言》第二版中文版,高清带目录PDF格式
C程序设计语言(第2版·新版) 完整扫描版 带书签 pdf
C程序设计语言(第2版·新版) 完整扫描版 带书签 pdf
C++程序设计语言(特别版)--源代码
提供的是书中的源代码,非课后练习源代码。 本版本是高清版,是第1版第18次印刷,是书签最全最好的版本。 基本信息 原书名: The C++ Programming Language, Special Edition 原出版社: Addison Wesley 作者: (美)Bjarne Stroustrup 译者: 裘宗燕 丛书名: 计算机科学丛书 出版社:机械工业出版社 ISBN:7111102029 上架时间:2002-7-12 出版日期:2002 年7月 页码:936 版次:1-1 内容简介    本书介绍了标准c++以及由c++所支持的关键性编程技术和设计技术。标准c++较以前的版本功能更强大,其中许多新的语言特性,如名字空间、异常、模板、运行时类型声明等使得新技术得以直接应用。本书围绕语言及库功能来组织,内容涉及c++的主要特征及标准库,并通过系统软件领域中的实例解释说明一些关键性的概念与技术。 本书的目的就是帮助读者了解c++是如何支持编程技术的,使读者能从中获得新的理解,从而成为一名优秀的编程人员和设计人员。适合做高校面向对象编程课程的教科书,也可作为c++爱好者的参考书。 [center] [a href=http://www.china-pub.com/main/sale/c++tb.htm target=_blank]c++之父bjarne stroustrup博士专访[/a]    [a href="http://www.is.pku.edu.cn/~qzy/cpp.htm" target="_blank"]《c++程序设计语言》程序的更正和更新[/a]    [a href="http://www.china-pub.com/temporary/list/cooperate/zipdownload/zg.zip" target="_blank"]本书忠告[/a] [/center] 作译者 作者: Bjarne Stroustrup Bjarne Stroustrup现任AT&T实验室的大型程序设计研究部的主管。1990年,Bjarne荣获《财富》杂志评选的“美国12位最年轻的科学家”称号。1993年,由于在C++领域的重大贡献,Bjarne获得了ACM该年度的 Grace Murray Hopper大奖并成为ACM院士(成立于1947年的ACM协会是历史最悠久、目前世界上最大的教育和科学计算协会,成为ACM院士是个人成就的里程碑)。1995年,BYTE杂志颁予他“近20年来计算机工业最具影响力的20人”的称号。 [同作者作品] C++ 程序设计语言(特别版)(英文影印版) C++语言的设计和演化[按需印刷] C++程序设计语言(特别版) 译者: 裘宗燕 知名译者,翻译严谨,喜与读者交流。   裘宗燕教授是北京大学数学学院信息科学系的,关心的主要学术领域包括计算机软件理论、程序设计方法学、程序设计语言和符号计算。已出版多部著作和译著,包括《程序设计语言基础》(译著,1990),《Mathematica数学软件系统的应用与程序设计》(1994),《从问题到程序——程序设计与C语言引论》(1999) [同作者作品] 计算机基础教程(上下)(文科类)(裘宗燕等) 数据结构——C++与面向对象的途径 数据结构--C++与面向对象的途径(修订版) 目录 出版者的话 专家指导委员会 中文版序 译者序 序 第2版序 第1版序 导 论 第1章 致读者 3 1.1 本书的结构 3 1.1.1 例子和参考 4 1.1.2 练习 5 1.1.3 有关实现的注记 5 1.2 学习c++ 6 1.3 c++ 的设计 7 1.3.1 效率和结构 8 1.3.2 哲学注记 9 1.4 历史注记 9 1.5 c++ 的使用 11 1.6 c和c++ 12 .1.6.1 给c程序员的建议 13 1.6.2 给c++程序员的建议 13 1.7 有关在c++里编程的思考 14 1.8 忠告 15 1.9 参考文献 16 第2章 c++概览 19 2.1 为什么是c++ 19 2.2 程序设计范型 19 2.3 过程式程序设计 20 2.3.1 变量和算术 21 2.3.2 检测和循环 22 2.3.3 指针和数组 23 2.4 模块程序设计 23 2.4.1 分别编译 24 2.4.2 异常处理 25 2.5 数据抽象 26 2.5.1 定义类型的模块 27 2.5.2 用户定义类型 28 2.5.3 具体类型 29 2.5.4 抽象类型 31 2.5.5 虚函数 33 2.6 面向对象的程序设计 33 2.6.1 具体类型的问题 33 2.6.2 类层次结构 34 2.7 通用型程序设计 36 2.7.1 容器 36 2.7.2 通用型算法 37 2.8 附言 38 2.9 忠告 39 第3章 标准库概览 40 3.1 引言 40 3.2 hello, world! 40 3.3 标准库名字空间 41 3.4 输出 41 3.5 字符串 42 3.5.1 c风格的字符串 44 3.6 输入 44 3.7 容器 46 3.7.1 向量—vector 46 3.7.2 范围检查 47 3.7.3 表—list 48 3.7.4 映射—map 49 3.7.5 标准容器 49 3.8 算法 50 3.8.1 迭代器的使用 51 3.8.2 迭代器类型 52 3.8.3 迭代器和i/o 53 3.8.4 遍历和谓词 54 3.8.5 使用成员函数的算法 56 3.8.6 标准库算法 56 3.9 数学 57 3.9.1 复数 57 3.9.2 向量算术 57 3.9.3 基本数值支持 58 3.10 标准库功能 58 3.11 忠告 58 第一部分 基本功能 第4章 类型和声明 63 4.1 类型 63 4.1.1 基本类型 64 4.2 布尔量 64 4.3 字符类型 65 4.3.1 字符文字量 66 4.4 整数类型 66 4.4.1 整数文字量 66 4.5 浮点类型 67 4.5.1 浮点文字量 67 4.6 大小 68 4.7 void 69 4.8 枚举 69 4.9 声明 71 4.9.1 声明的结构 72 4.9.2 声明多个名字 73 4.9.3 名字 73 4.9.4 作用域 74 4.9.5 初始化 75 4.9.6 对象和左值 76 4.9.7 typedef 76 4.10 忠告 77 4.11 练习 77 第5章 指针、数组和结构 79 5.1 指针 79 5.1.1 零 80 5.2 数组 80 5.2.1 数组初始化 80 5.2.2 字符串文字量 81 5.3 到数组的指针 83 5.3.1 在数组里漫游 83 5.4 常量 85 5.4.1 指针和常量 87 5.5 引用 88 5.6 指向void的指针 90 5.7 结构 91 5.7.1 类型等价 94 5.8 忠告 94 5.9 练习 94 第6章 表达式和语句 96 6.1 一个桌面计算器 96 6.1.1 分析器 96 6.1.2 输入函数 100 6.1.3 低级输入 102 6.1.4 错误处理 103 6.1.5 驱动程序 104 6.1.6 头文件 104 6.1.7 命令行参数 105 6.1.8 有关风格的注记 106 6.2 运算符概览 107 6.2.1 结果 109 6.2.2 求值顺序 110 6.2.3 运算符优先级 110 6.2.4 按位逻辑运算符 111 6.2.5 增量和减量 112 6.2.6 自由存储 113 6.2.7 显式类型转换 116 6.2.8 构造函数 117 6.3 语句概览 118 6.3.1 声明作为语句 119 6.3.2 选择语句 119 6.3.3 迭代语句 122 6.3.4 goto 123 6.4 注释和缩进编排 123 6.5 忠告 125 6.6 练习 125 第7章 函数 128 7.1 函数声明 128 7.1.1 函数定义 128 7.1.2 静态变量 129 7.2 参数传递 130 7.2.1 数组参数 131 7.3 返回值 132 7.4 重载函数名 133 7.4.1 重载和返回类型 135 7.4.2 重载与作用域 135 7.4.3 手工的歧义性解析 135 7.4.4 多参数的解析 136 7.5 默认参数 137 7.6 未确定数目的参数 138 7.7 指向函数的指针 139 7.8 宏 143 7.8.1 条件编译 145 7.9 忠告 145 7.10 练习 146 第8章 名字空间和异常 148 8.1 模块化和界面 148 8.2 名字空间 150 8.2.1 带限定词的名字 151 8.2.2 使用声明 152 8.2.3 使用指令 153 8.2.4 多重界面 154 8.2.5 避免名字冲突 157 8.2.6 名字查找 159 8.2.7 名字空间别名 159 8.2.8 名字空间组合 160 8.2.9 名字空间和老代码 163 8.3 异常 166 8.3.1 抛出和捕捉 167 8.3.2 异常的辨识 168 8.3.3 在计算器中的异常 169 8.4 忠告 173 8.5 练习 173 第9章 源文件和程序 175 9.1 分别编译 175 9.2 连接 176 9.2.1 头文件 178 9.2.2 标准库头文件 179 9.2.3 单一定义规则 180 9.2.4 与非c++代码的连接 182 9.2.5 连接与指向函数的指针 184 9.3 使用头文件 184 9.3.1 单一头文件 184 9.3.2 多个头文件 187 9.3.3 包含保护符 191 9.4 程序 192 9.4.1 非局部变量的初始化 192 9.5 忠告 194 9.6 练习 194 第二部分 抽象机制 第10章 类 199 10.1 引言 199 10.2 类 199 10.2.1 成员函数 200 10.2.2 访问控制 201 10.2.3 构造函数 202 10.2.4 静态成员 203 10.2.5 类对象的复制 204 10.2.6 常量成员函数 205 10.2.7 自引用 205 10.2.8 结构和类 208 10.2.9 在类内部的函数定义 210 10.3 高效的用户定义类型 210 10.3.1 成员函数 212 10.3.2 协助函数 214 10.3.3 重载的运算符 215 10.3.4 具体类型的意义 215 10.4 对象 216 10.4.1 析构函数 216 10.4.2 默认构造函数 217 10.4.3 构造和析构 218 10.4.4 局部变量 218 10.4.5 自由存储 220 10.4.6 类对象作为成员 221 10.4.7 数组 223 10.4.8 局部静态存储 224 10.4.9 非局部存储 225 10.4.10 临时对象 226 10.4.11 对象的放置 228 10.4.12 联合 229 10.5 忠告 230 10.6 练习 230 第11章 运算符重载 233 11.1 引言 233 11.2 运算符函数 234 11.2.1 二元和一元运算符 235 11.2.2 运算符的预定义意义 236 11.2.3 运算符和用户定义类型 236 11.2.4 名字空间里的运算符 237 11.3 一个复数类型 238 11.3.1 成员运算符和非成员运算符 238 11.3.2 混合模式算术 239 11.3.3 初始化 240 11.3.4 复制 241 11.3.5 构造函数和转换 242 11.3.6 文字量 243 11.3.7 另一些成员函数 243 11.3.8 协助函数 244 11.4 转换运算符 245 11.4.1 歧义性 246 11.5 友元 248 11.5.1 友元的寻找 249 11.5.2 友元和成员 250 11.6 大型对象 251 11.7 基本运算符 253 11.7.1 显式构造函数 253 11.8 下标 255 11.9 函数调用 256 11.10 间接 257 11.11 增量和减量 259 11.12 一个字符串类 260 11.13 忠告 265 11.14 练习 265 第12章 派生类 268 12.1 引言 268 12.2 派生类 269 12.2.1 成员函数 271 12.2.2 构造函数和析构函数 272 12.2.3 复制 273 12.2.4 类层次结构 273 12.2.5 类型域 274 12.2.6 虚函数 276 12.3 抽象类 278 12.4 类层次结构的设计 280 12.4.1 一个传统的层次结构 280 12.4.2 抽象类 283 12.4.3 其他实现方式 285 12.4.4 对象创建的局部化 287 12.5 类层次结构和抽象类 289 12.6 忠告 289 12.7 练习 289 第13章 模板 292 13.1 引言 292 13.2 一个简单的string模板 293 13.2.1 定义一个模板 294 13.2.2 模板实例化 295 13.2.3 模板参数 296 13.2.4 类型等价 296 13.2.5 类型检查 297 13.3 函数模板 298 13.3.1 函数模板的参数 299 13.3.2 函数模板的重载 300 13.4 用模板参数描述策略 302 13.4.1 默认模板参数 303 13.5 专门化 304 13.5.1 专门化的顺序 306 13.5.2 模板函数的专门化 307 13.6 派生和模板 308 13.6.1 参数化和继承 309 13.6.2 成员模板 310 13.6.3 继承关系 311 13.7 源代码组织 312 13.8 忠告 314 13.9 练习 314 第14章 异常处理 316 14.1 错误处理 316 14.1.1 关于异常的其他观点 318 14.2 异常的结组 318 14.2.1 派生的异常 319 14.2.2 多个异常的组合 321 14.3 捕捉异常 321 14.3.1 重新抛出 322 14.3.2 捕捉所有异常 322 14.4 资源管理 324 14.4.1 构造函数和析构函数的使用 325 14.4.2 auto_ptr 326 14.4.3 告诫 328 14.4.4 异常和new 328 14.4.5 资源耗尽 329 14.4.6 构造函数里的异常 331 14.4.7 析构函数里的异常 332 14.5 不是错误的异常 333 14.6 异常的描述 334 14.6.1 对异常描述的检查 335 14.6.2 未预期的异常 336 14.6.3 异常的映射 336 14.7 未捕捉的异常 338 14.8 异常和效率 339 14.9 处理错误的其他方式 340 14.10 标准异常 342 14.11 忠告 344 14.12 练习 344 第15章 类层次结构 346 15.1 引言和概述 346 15.2 多重继承 346 15.2.1 歧义性解析 348 15.2.2 继承和使用声明 349 15.2.3 重复的基类 350 15.2.4 虚基类 352 15.2.5 使用多重继承 354 15.3 访问控制 357 15.3.1 保护成员 359 15.3.2 对基类的访问 360 15.4 运行时类型信息 361 15.4.1 dynamic_cast 363 15.4.2 在类层次结构中漫游 365 15.4.3 类对象的构造与析构 367 15.4.4 typeid和扩展的类型信息 368 15.4.5 rtti的使用和误用 370 15.5 指向成员的指针 371 15.5.1 基类和派生类 373 15.6 自由存储 374 15.6.1 数组分配 375 15.6.2 虚构造函数 376 15.7 忠告 377 15.8 练习 377 第三部分 标 准 库 第16章 库组织和容器 381 16.1 标准库的设计 381 16.1.1 设计约束 382 16.1.2 标准库组织 383 16.1.3 语言支持 385 16.2 容器设计 386 16.2.1 专门化的容器和迭代器 386 16.2.2 有基类的容器 388 16.2.3 stl容器 391 16.3 向量 392 16.3.1 类型 393 16.3.2 迭代器 394 16.3.3 元素访问 395 16.3.4 构造函数 396 16.3.5 堆栈操作 399 16.3.6 表操作 401 16.3.7 元素定位 403 16.3.8 大小和容量 404 16.3.9 其他成员函数 406 16.3.10 协助函数 406 16.3.11 vector[bool] 407 16.4 忠告 407 16.5 练习 408 第17章 标准容器 409 17.1 标准容器 409 17.1.1 操作综述 409 17.1.2 容器综述 412 17.1.3 表示 413 17.1.4 对元素的要求 413 17.2 序列 416 17.2.1 向量—vector 416 17.2.2 表—list 416 17.2.3 双端队列—deque 420 17.3 序列适配器 421 17.3.1 堆栈—stack 421 17.3.2 队列—queue 422 17.3.3 优先队列—priority_queue 423 17.4 关联容器 425 17.4.1 映射—map 425 17.4.2 多重映射—multimap 433 17.4.3 集合—set 434 17.4.4 多重集合—multiset 435 17.5 拟容器 435 17.5.1 串—string 435 17.5.2 值向量—valarray 435 17.5.3 位集合—bitset 435 17.5.4 内部数组 439 17.6 定义新容器 439 17.6.1 散列映射—hash_map 440 17.6.2 表示和构造 441 17.6.3 其他散列关联容器 446 17.7 忠告 446 17.8 练习 446 第18章 算法和函数对象 449 18.1 引言 449 18.2 标准库算法综述 449 18.3 序列和容器 453 18.3.1 输入序列 453 18.4 函数对象 454 18.4.1 函数对象的基类 456 18.4.2 谓词 456 18.4.3 算术函数对象 458 18.4.4 约束器、适配器和否定器 458 18.5 非修改性序列算法 463 18.5.1 对每个做—for_each 463 18.5.2 查找族函数 464 18.5.3 计数 465 18.5.4 相等和不匹配 466 18.5.5 搜索 467 18.6 修改性序列算法 467 18.6.1 复制 468 18.6.2 变换 469 18.6.3 惟一化 471 18.6.4 取代 473 18.6.5 删除 474 18.6.6 填充和生成 474 18.6.7 反转和旋转 475 18.6.8 交换 476 18.7 排序的序列 476 18.7.1 排序 476 18.7.2 二分检索 477 18.7.3 归并 478 18.7.4 划分 479 18.7.5 序列上的集合运算 479 18.8 堆 480 18.9 最小和最大 481 18.10 排列 482 18.11 c风格算法 482 18.12 忠告 483 18.13 练习 483 第19章 迭代器和分配器 485 19.1 引言 485 19.2 迭代器和序列 485 19.2.1 迭代器的操作 486 19.2.2 迭代器特征类—iterator_traits 487 19.2.3 迭代器类别 488 19.2.4 插入器 490 19.2.5 反向迭代器 491 19.2.6 流迭代器 492 19.3 带检查迭代器 495 19.3.1 异常、容器和算法 499 19.4 分配器 500 19.4.1 标准分配器 500 19.4.2 一个用户定义分配器 503 19.4.3 广义的分配器 505 19.4.4 未初始化的存储 506 19.4.5 动态存储 508 19.4.6 c风格的分配 509 19.5 忠告 510 19.6 练习 510 第20章 串 511 20.1 引言 511 20.2 字符 511 20.2.1 字符特征类—char_traits 512 20.3 基础串类—basic_string 513 20.3.1 类型 514 20.3.2 迭代器 515 20.3.3 元素访问 516 20.3.4 构造函数 516 20.3.5 错误 517 20.3.6 赋值 518 20.3.7 到c风格字符串的转换 519 20.3.8 比较 521 20.3.9 插入 522 20.3.10 拼接 523 20.3.11 查找 524 20.3.12 替换 525 20.3.13 子串 526 20.3.14 大小和容量 527 20.3.15 i/o操作 527 20.3.16 交换 528 20.4 c标准库 528 20.4.1 c风格字符串 528 20.4.2 字符分类 530 20.5 忠告 530 20.6 练习 531 第21章 流 533 21.1 引言 533 21.2 输出 534 21.2.1 输出流 535 21.2.2 内部类型的输出 536 21.2.3 用户定义类型的输出 538 21.3 输入 540 21.3.1 输入流 540 21.3.2 内部类型的输入 540 21.3.3 流状态 542 21.3.4 字符的输入 544 21.3.5 用户定义类型的输入 546 21.3.6 异常 547 21.3.7 流的联结 548 21.3.8 哨位 549 21.4 格式化 550 21.4.1 格式状态 550 21.4.2 整数输出 552 21.4.3 浮点数输出 552 21.4.4 输出域 553 21.4.5 域的调整 555 21.4.6 操控符 555 21.5 文件流与字符串流 560 21.5.1 文件流 561 21.5.2 流的关闭 562 21.5.3 字符串流 563 21.6 缓冲 564 21.6.1 输出流和缓冲区 565 21.6.2 输入流和缓冲区 566 21.6.3 流和缓冲区 567 21.6.4 流缓冲区 567 21.7 现场 571 21.7.1 流回调 572 21.8 c输入/输出 573 21.9 忠告 575 21.10 练习 576 第22章 数值 578 22.1 引言 578 22.2 数值的限制 578 22.2.1 表示限制的宏 580 22.3 标准数学函数 580 22.4 向量算术 582 22.4.1 valarray的构造 582 22.4.2 valarray的下标和赋值 583 22.4.3 成员操作 584 22.4.4 非成员函数 586 22.4.5 切割 587 22.4.6 切割数组—slice_array 589 22.4.7 临时量、复制和循环 593 22.4.8 广义切割 595 22.4.9 屏蔽 596 22.4.10 间接数组—indirect_array 596 22.5 复数算术 597 22.6 通用数值算法 599 22.6.1 累积—accumulate 599 22.6.2 内积—inner_product 600 22.6.3 增量变化 600 22.7 随机数 602 22.8 忠告 603 22.9 练习 603 第四部分 用c++ 做设计 第23章 开发和设计 607 23.1 概述 607 23.2 引言 607 23.3 目的与手段 609 23.4 开发过程 611 23.4.1 开发循环 613 23.4.2 设计目标 615 23.4.3 设计步骤 616 23.4.4 试验和分析 623 23.4.5 测试 625 23.4.6 软件维护 625 23.4.7 效率 626 23.5 管理 626 23.5.1 重用 627 23.5.2 规模 628 23.5.3 个人 629 23.5.4 混成设计 630 23.6 带标注的参考文献 631 23.7 忠告 633 第24章 设计和编程 635 24.1 概述 635 24.2 设计和程序设计语言 635 24.2.1 忽视类 637 24.2.2 忽视继承 638 24.2.3 忽视静态类型检查 638 24.2.4 忽视程序设计 641 24.2.5 排他性地使用类层次结构 642 24.3 类 643 24.3.1 类表示什么 643 24.3.2 类层次结构 644 24.3.3 包容关系 648 24.3.4 包容和继承 649 24.3.5 使用关系 653 24.3.6 编入程序里的关系 654 24.3.7 类内的关系 656 24.4 组件 661 24.4.1 模板 663 24.4.2 界面和实现 665 24.4.3 肥大的界面 667 24.5 忠告 668 第25章 类的作用 670 25.1 类的种类 670 25.2 具体类型 672 25.2.1 具体类型的重用 672 25.3 抽象类型 674 25.4 结点 676 25.4.1 修改界面 677 25.5 动作 680 25.6 界面类 681 25.6.1 调整界面 683 25.7 句柄类 684 25.7.1 句柄上的操作 687 25.8 应用框架 688 25.9 忠告 689 25.10 练习 690 附录和索引 附录a 语法 695 附录b 兼容性 713 附录c 技术细节 724 附录d 现场 759 附录e 标准库的异常时安全性 815 索引 845 译者序    Bjarne Stroustrup的《The C++ Programming Language》是有关C++语言的第一部著作。毫无疑问,它是关于C++语言及其程序设计的最重要著作,在此领域中的地位是无可替代的。《The C++ Programming Language》一书伴随着C++语言的发展演化而不断进步,经过第1版(1985年)、第2版(1991年),第3版(1998年),本书的英文原书是《The C++ Programming Language》第3版经过补充和修订后的“特别版(2000)”(对应于国内引进的影印本)。对于这个中译本,我想说的第一句话就是“来得太晚了”。   要学习C++语言和程序设计,要将C++应用于程序设计实践,本书自然是必读之书。这个“特别版”以标准化的C++语言为基础,讨论了C++的各种语言特征和有效使用这一语言的程序设计技术。书中也用了大量的篇幅,在标准库以及一般软件开发的环境下,讨论了使用C++语言编程和组织程序的许多高级技术。本书内容覆盖了C++语言及其程序设计的各个方面,其技术深度与广度是举世公认的。   然而,作者讨论的并不仅是C++语言及其程序设计。本书的讨论远远超出这一范围,第四部分用了大量的篇幅去讨论软件开发过程及其问题。即使是在介绍C++语言及其程序设计的具体问题时,作者也常在程序结构、设计和软件开发的大环境下,提出自己的许多认识。作者有很强的计算机科学与技术基础,在系统软件开发方面极富经验,他所提出的观点和意见值得每个在这个领域中工作的人的重视。 当然,重视并不是盲从。在Stroustrup的两本关于C++的重要著作(本书和《C++语言的设计与演化》(已由机械工业版社出版))中,都有这样一句话使我印象深刻:希望读者带着一种健康的怀疑态度。看来这是作者深深铭刻在心的一种思想,也特别值得国内每个从事信息技术,或者努力向这个方向发展的人注意。从来就没有什么救世主,Stroustrup不是在传道,他只是在总结和论述自己在这个领域中工作的经验。请不要将本书中的东西作为教条,那也一定是本书作者所深恶痛绝的。   许多人说本书比较难读,这种说法有一定道理。真正理解本书的一般性内容需要花一些时间,融会贯通则更需要下功夫。理解本书的内容不仅需要去读它,还需要去实践。问题是,花这个时间值吗?作者在讨论C++语言的设计时提出了一个观点:你从C++语言中的收获大致与在学习实践这个语言的过程中所付出的努力成正比;而且C++是一个可以伴随你成长的语言。同样的话也适用于本书。如果你致力于将自己发展成一个职业的程序员,或者要在计算机方面的技术领域中长期工作下去,我认为,你从本书中的收获大致也会与你所花的时间成正比,这本书也是一本能够伴随你成长的书。   当然,这本书也不是没有缺陷的。由于作者有着极其丰富的实践经验,因此,当他想要论述一个问题、提出一个观点时,常会想到在自己长期实践中最适合说明这个问题的示例,用几句简短的话引述有关的情况。由于作者对C++谙练有加,因此,在讨论中有时会不知不觉地将某些并不显然的东西当作不言自明的事情提出来。而对于许多初学者而言,这些都可能成为学习中的障碍。为了帮助这部分读者,我也在书中一些地方加入了少量注释,解释一些背景性情况。过多过滥的注释会增大书的篇幅,干扰读者阅读,绝不会是大家都喜欢的方式。因此我在这样做的时候也很有节制,希望不会引起读者的反感。   由于读者的水平有极大差异,对一些人很熟的东西,对另一些人可能就会莫名其妙。我无法解决所有问题,但也希望能为广大读者做一点服务性的工作(谁让我翻译了这本书呢!)。为了帮助初学者入门,为使本书(包括其中文译本)能更好地在国内计算机领域中发挥作用,也为了关心本书、学习本书的人们能够有一个交流经验、传播认识的场所,我将在下面地址维护一个有关本书的信息、情况、认识和意见的网页:   http://www.math.pku.edu.cn/teachers/qiuzy/cpp.htm   在其中收集有关的信息,记录朋友们(包括我自己)的认识与意见,提出的问题和相应的认识,有关这一译本的勘误信息,原英文书的更正与更新信息等。欢迎诸位提供自己的见解和问题,提供有价值的线索。我没时间去创建与维护一个“纯的”C++语言及其程序设计的讨论组(确实需要这样的场所,而有关VC等的讨论组倒是太多了。如果有人愿做,我乐得坐享其成、积极参与并尽可能提供帮助),只想抽空将接收到的和自己写的东西编辑公布。与我联系可以给我发email:qzy@math.pku.edu.cn。我还将把有关《C++语言的设计与演化》一书的相关信息也放在那里,供大家参考。   还请读者注意,本书的英文原版书是“特别版”的第1次印刷,即“第3版”的第11次印刷,也是目前国内可买到的影印本的原书。在那以后,作者在重印时不断更正书中的错误,并修改了少量的程序示例。最新的重印是第16次印刷,有关情况可从作者的网页或上面网址找到。由于一些情况,本书无法按最新的重印本翻译,但我还是参考了作者的网页,在译文中尽可能地采纳了有关勘误信息。此外,在翻译过程中我也发现了一些错误。经与作者通过电子邮件讨论取得了一致意见,有关更正反映在本书里。由于这些原因,本书在个别地方的说法可能与读者手头的英文原书有异。如果想确认有关情况,请查看原书的勘误信息。   裘宗燕   2002年2月于北京大学数学学院信息科学系    序言    去编程就是去理解。    —Kristen Nyggard    我觉得用C++ 编程序比以往更令人感到愉快。在过去这些年里,C++ 在支持设计和编程方面取得了令人振奋的进步,针对其使用的大量新技术已经被开发出来了。然而,C++ 并不就是好玩。普通的实际程序员在几乎所有种类和规模的开发项目上,在生产率、可维护性、灵活性和质量方面都取得了显著的进步。到今天为止,C++ 已经实现了我当初对它的期望中的绝大部分,还在许多我原来根本没有梦想过的工作中取得了成功。    本书介绍的是标准C++以及由C++ 所支持的关键性编程技术和设计技术。与本书第1版所介绍的那个C++ 版本相比,标准C++ 是一个经过了更仔细推敲的更强大的语言。各种新的语言特征,如名字空间、异常、模板,以及运行时类型识别,使人能以比过去更直接的方式使用许多技术,标准库使程序员能够从比基本语言高得多的层面上起步。    本书第2版中大约有三分之一的内容来自第1版。这个第3版则是重写了比例更大的篇幅的结果。它提供的许多东西是大部分有经验的程序员也需要的,与此同时,本书也比它的以前版本更容易供新手入门。C++ 使用的爆炸性增长和作为其结果的海量经验积累使这些成为可能。    一个功能广泛的标准库定义使我能以一种与以前不同的方式介绍C++ 的各种概念。与过去一样,本书对C++ 的介绍与任何特定的实现都没有关系;与过去一样,教材式的各章还是采用“自下而上”的方式,使每种结构都是在定义之后才使用。无论如何,使用一个设计良好的库远比理解其实现细节容易得多。由于这些情况,在假定读者已经理解了标准库的内部工作原理之前,就可以利用它提供许多更实际更有趣的例子。标准库本身也是程序设计实例和设计技术的丰富源泉。    本书将介绍每种主要的C++ 语言特征和这个标准库,它是围绕着语言和库功能组织起来的。当然,各种特征都将在使用它们的环境中介绍。也就是说,这里所关注的是将语言作为一种设计和编程的工具,而不是语言本身。本书将展示那些使C++ 卓有成效的关键性技术,讲述为掌握它们所需要的那些基本概念。除了专门阐释技术细节的那些地方之外,其他示例都取自系统软件领域。另一本与本书配套出版的书《带标注的C++ 语言标准》(The Annotated C++ Language Standard),将给出完整的语言定义,所附标注能使它更容易理解。    本书的基本目标就是帮助读者理解C++ 所提供的功能将如何支持关键性的程序设计技术。这里的目标是使读者能远远超越简单地复制示例并使之能够运行,或者模仿来自其他语言的程序设计风格。只有对隐藏在语言背后的思想有了一个很好的理解之后,才能真正掌握这个语言。如果有一些具体实现的文档的辅助,这里所提供的信息就足以对付具有挑战性的真实世界中的重要项目。我的希望是,本书能帮助读者获得新的洞察力,使他们成为更好的程序员和设计师。    致谢    除了第1版和第2版的致谢中所提到的那些人之外,我还要感谢Matt Austern,Hans Boehm,Don Caldwell,Lawrence Crowl,Alan Feuer,Andrew Forrest,David Gay,Tim Griffin,Peter Juhl,Brian Kernighan,Andrew Koenig,Mike Mowbray,Rob Murray,Lee Nackman,Joseph Newcomer,Alex Stepanov,David Vandevoorde,Peter Weinberger和Chris Van Wyk,他们对第3版各章的初稿提出了许多评论和意见。没有他们的帮助和建议,这本书一定会更难理解,包含更多的错误,没有这么完全,当然也可能稍微短一点。    我还要感谢C++ 标准化委员会的志愿者们,是他们完成了规模宏大的建设性工作,才使C++ 具有它今天这个样子。要罗列出每个人就会有一点不公平,但一个也不提就更不公平,所以我想特别提出Mike Ball,Dag Br焎k,Sean Corfield,Ted Goldstein,Kim Knuttila,Andrew Koenig,Jos?Lajoie,Dmitry Lenkov,Nathan Myers,Martin O'Riordan,Tom Plum,Jonathan Shopiro,John Spicer, Jerry Schwarz,Alex Stepanov和Mike Vilot,他们中的每个都在C++及其标准库的某些方面直接与我合作过。    在这本书第一次印刷之后,许多人给我发来电子邮件,提出更正和建议。我已经在原书的结构里响应了他们的建议,使后来出版的版本大为改善。将本书翻译到各种语言的译者也提供了许多澄清性的意见。作为对这些读者的回应,我增加了附录D和附录E。让我借这个机会感谢他们之中特别有帮助的几位:Dave Abrahams,Matt Austern,Jan Bielawski,Janina Mincer Daszkiewicz,Andrew Koenig,Dietmar K焗l,Nicolai Josuttis,Nathan Myers,Paul E. Sevinc,Andy Tenne-Sens,Shoichi Uchida,Ping-Fai(Mike) Yang和Dennis Yelle。    Bjarne Stroustrup   Murray Hill,新泽西    第2版序    前路漫漫。    —Bilbo Baggins    正如在本书的第1版所承诺的,C++ 为满足其用户的需要正在不断地演化。这一演化过程得助于许多有着极大的背景差异,在范围广泛的应用领域中工作的用户们的实际经验的指导。在第1版出版后的六年中,C++ 的用户群体扩大了不只百倍,人们学到了许多东西,发现了许多新技术并通过了实践的检验。这些技术中的一些也在这一版中有所反映。    在过去六年里所完成的许多语言扩展,其基本宗旨就是将C++ 提升成为一种服务于一般性的数据抽象和面向对象程序设计的语言,特别是提升为一个可编写高质量的用户定义类型库的工具。一个“高质量的库”是指这样的库,它以一个或几个方便、安全且高效的类的形式,给用户提供了一个概念。在这个环境中,安全意味着这个类在库的使用者与它的供方之间构成了一个特殊的类型安全的界面;高效意味着与手工写出的C代码相比,这种库的使用不会给用户强加明显的运行时间上或空间上的额外开销。    本书介绍的是完整的C++ 语言。从第1章到第10章是一个教材式的导引,第11章到第13章展现的是一个有关设计和软件开发问题的讨论,最后包含了完整的C++ 参考手册。自然,在原来版本之后新加入的特征和变化已成为这个展示的有机组成部分。这些特征包括:经过精化后的重载解析规则和存储管理功能,以及访问控制机制、类型安全的连接、const和static成员函数、抽象类、多重继承、模板和异常处理。 .   C++ 是一个通用的程序设计语言,其核心应用领域是最广泛意义上的系统程序设计。此外,C++ 还被成功地用到许多无法称为系统程序设计的应用领域中。从最摩登的小型计算机到最大的超级计算机上,以及几乎所有操作系统上都有C++ 的实现。因此,本书描述的是C++ 语言本身,并不想试着去解释任何特殊的实现、程序设计环境或者库。    本书中给出的许多类的示例虽然都很有用,但也还是应该归到“玩具”一类。与在完整的精益求精的程序中做解释相比,这里所采用的解说风格能更清晰地呈现那些具有普遍意义的原理和极其有用的技术,在实际例子中它们很容易被细节所淹没。这里给出的大部分有用的类,如链接表、数组、字符串、矩阵、图形类、关联数组等,在广泛可用的各种商品的和非商品资源中,都有可用的“防弹”和/或“金盘”版本。那些“具有工业强度”的类和库中的许多东西,实际上不过是在这里可以找到的玩具版本的直接或间接后裔。    与本书的第1版相比,这一版更加强调本书的教学方面的作用。然而,这里的叙述仍然是针对有经验的程序员,并努力不去轻视他们的智慧和经验。有关设计问题的讨论有了很大的扩充,作为对读者在语言特征及其直接应用之外的要求的一种回应。技术细节和精确性也有所增强。特别是,这里的参考手册表现了在这个方向上多年的工作。我的目标是提供一本具有足够深度的书籍,使大部分程序员能在多次阅读中都有所收获。换句话说,这本书给出的是C++ 语言,它的基本原理,以及使用时所需要的关键性技术。欢迎欣赏!    致谢    除了在第1版序中致谢里所提到人们之外,我还要感谢Al Aho,Steve Buroff,Jim Coplien,Ted Goldstein,Tony Hansen,Lorraine Juhl,Peter Juhl, Brian Kernighan,Andrew Koenig,Bill Leggett,Warren Montgomery,Mike Mowbray,Rob Murray,Jonathan Shopiro,Mike Vilot和Peter Weinberger,他们对第2版的初稿提出了许多意见。许多人对C++从1985年到1991年的开发有很大影响,我只能提出其中几个:Andrew Koenig,Brian Kernighan,Doug McIlroy和Johathan Shopiro。还要感谢参考手册“外部评阅”的许多参与者,以及在X3J16的整个第一年里一直在其中受苦的人们。    Bjarne Stroustrup Murray Hill,新泽西    第1 版序    语言磨砺了我们思维的方式,也决定着我们思考的范围。    —B.L. Whorf    C++ 是一种通用的程序设计语言,其设计就是为了使认真的程序员工作得更愉快。除了一些小细节之外,C++ 是C程序设计语言的一个超集。C++ 提供了C所提供的各种功能,还为定义新类型提供了灵活而有效的功能。程序员可以通过定义新类型,使这些类型与应用中的概念紧密对应,从而把一个应用划分成许多容易管理的片段。这种程序构造技术通常被称为数据抽象。某些用户定义类型的对象包含着类型信息,这种对象就可以方便而安全地用在那种对象类型无法在编译时确定的环境中。使用这种类型的对象的程序通常被称为是基于对象的。如果用得好,这些技术可以产生出更短、更容易理解,而且也更容易管理的程序。    C++ 里的最关键概念是类。一个类就是一个用户定义类型。类提供了对数据的隐藏,数据的初始化保证,用户定义类型的隐式类型转换,动态类型识别,用户控制的存储管理,以及重载运算符的机制等。在类型检查和表述模块性方面,C++提供了比C好得多的功能。它还包含了许多并不直接与类相关的改进,包括符号常量、函数的在线替换、默认函数参数、重载函数名、自由存储管理运算符,以及引用类型等。C++ 保持了C高效处理硬件基本对象(位、字节、字、地址等)的能力。这就使用户定义类型能够在相当高的效率水平上实现。    C++ 及其标准库也是为了可移植性而设计的。当前的实现能够在大多数支持C的系统上运行。C的库也能用于C++ 程序,而且大部分支持C程序设计的工具也同样能用于C++。    本书的基本目标就是帮助认真的程序员学习这个语言,并将它用于那些非平凡的项目。书中提供了有关C++ 的完整描述,许多完整的例子,以及更多的程序片段。    致谢    如果没有许多朋友和同事持之以恒的使用、建议和建设性的批评,C++ 绝不会像它现在这样成熟。特别地,Tom Cargill,Jim Coplien,Stu Feldman,Sandy Fraser,Steve Johnson,Brian Kernighan,Bart Locanthi,Doug McIlroy,Dennis Rechie,Larry Rosler,Jerry Schwarz和Jon Shopiro对语言发展提供了重要的思想。Dave Presotto写出了流I/O库的当前实现。    此外,还有成百的人们对C++ 及其编译器的开发做出了贡献:他们给我提出改进的建议,描述他们所遇到的问题,告诉我编译中的错误等。我只能提出其中的很少几位:Gary Bishop,Abdrew Hume,Tom Karzes,Victor Milenkovic,Rob Murray,Leonie Rose,Brian Schmult和Gary Walker。    许多人在本书的撰写过程中为我提供了帮助,特别值得提出的是Jon Bentley,Laura Eaves,Brian Kernighan,Ted Kowalski,Steve Mahaney,Jon Shopiro,以及参加1985年7月26 ~ 27日俄亥俄州哥伦布贝尔实验室C++ 课程的人们。    Bjarne Stroustrup   Murray Hill, 新泽西    中文版序    本书是讲述标准C++的最完整和最新的著作,它拥有最多的读者,使用也最为广泛。按我目前的统计,本书已经被翻译成17种语言(参见http://WWW.research.att.com/~bs/covers.html)。所以,这个译本所依据的原文,已经从成千上万的读者建议中获益匪浅。    现在,中国的程序员和事事学子能够更容易地读到本书,对此我尤感欣慰。我的中国同事,还有许许多多中国的程序员(通过电子邮件)早就向我建议有必要将本书译为中文。因为自己的母语也不是英语,我当然也认识到了这种必要性--何况,我还非常喜欢拿本书译本的总数作为C++得到广泛应用的活生生的例子。    自然了,所谓"仁者乐山,智者乐水",有人会更喜欢英文原版,而另一些人则会感觉阅读翻译成母语的版本更能消除理解上的障碍。我认识许多程序员同时使用原版和译本,这样既能发挥母语的优势,又能用英语与全世界的程序员进行交流。    本书涵盖了标准C++、它的标准库和C++所支持的基本技术,如面向对象程序设计和通用型程序设计。其目的不仅仅是阐述语言的功能,还要提供如何行之有效地使用这些功能的信息,使程序员足以应付大多数开发项目。因此其中对设计的讨论非常重要。    1998年,ISO的C++标准(ISO/IEC 14882 Standond for the C++ Programming Language)得到了批准(各国标准委员会以22-0全票通过)。这是C++发展史上的一个里程碑,开创了C++工具和技术稳定发展的新纪元。    对我本人而言,其中关键在于,标准C++相对于以前的任何版本,更接近于我对C++的目标。标准C++及其标准库使我能够编写出比过去更好、更优雅、更高效的C++程序。    标准化的目的是为一种语言和一个库制定规范,使其能够服务于所有用户群体,而不至偏向于某个用户群、某个公司或某个国家。这是一个以保证质量和达成共识为目的的开放。公正的过程。    开放和民主的标准化过程存在~个潜在的问题:所谓"由委员会设计"。这在C++的标准化中基本上被避免了。原因之一在于,我担任了语言扩展工作组的主席。在此位置上,我负责评估所有关于主要语言扩展方面的建议,并就那些我本人、工作组和委员会都认为值得和可行的建议撰写最终版本。因此,委员会的主要活动是讨论提交上来的相对完整的设计,而不是自己来设计。与此类似,标准库的主要新增部分--"STL"(为容器、迭代器和算法提供了通用的、高效的、类型安全的和可扩展的框架),主要都源自一个人-Alexander stepanov的工作成果。    重要的是,C++标准不仅仅是一份文档。它已经在各种C+十实现产品中得到了体现。所有主要的C++实现产品现在都实现了标准,只有极少的几个例外。为了帮助厂商更好地实现标准,现在至少有两个公司提供了标准C++的验证套件。因此,我现在写代码,只要合适,都会用到标准C++提供的和本书这一版中讲述的功能。    C++语言的改进和标准库的增加,使我自己编写代码的方式发生了显著变化。现在我的程序比原来更加简洁、更加高效。这直接得益于标准C++对抽象更好、更系统和更纯粹的支持。    对模板和异常等功能更好的支持,使对底层处理和更混乱的功能的需要大大降低了。而且,最近几年出现了许多新的设计和编程技术,这在本书的表达方法和实例中都有所反映。    C++现在可以作为高级语言来讲授了。也就是说,重点一开始就可以放在算法和容器上,而不用再在什么位呀,联合呀,C风格字符串,数组等等东西上纠缠不清了。自然,底层的概念(如数组、重要的指针应用和强制转换)最终还是要教要学的。但是,可以等到作为新手的C++程序员、读者或学生已经成熟,能够在实现这些功能的高级概念的大背景中看待它们的时候,再对这些功能进行阐释。    我想特别强调(怎么强调都不过分)的是,应该多使用静态类型安全的字符串和容器,而不要学那些使用大量宏、强制转换和数组的编程风格。在本书中,我能够根本就不用宏,并且只在很少的非用不可的情况下才使用强制转换。我认为C/C++形式的宏是一种严重的缺陷--现在因为有了模板、名字空间、在线函数和常量这些正确的语言功能,它很大程度上更是一种多余了。同样,在任何语言中,强制转换的大量使用都是设计不良的标志。宏和强制转换是错误的主要渊薮。不用它们也能工作,这一点大大提高了C++编程的安全性和优雅性。    标准C++改变了我们使用C++编程、设计程序以及教授C++编程的方式。这些变化不可能"毕其功于一役"。我鼓励你在标准C++、在本书中所用的设计和编程技术,以及自己的编程方式上好好下一番功夫。我想脱胎换骨是有可能的。但是别太死心眼了。奇迹是不存在的,在产品代码中使用仅仅一知半解的语言功能和技术是相当危险的。现在该开始探索,开始试验了--标准C++真正对你有所种益的地方,就在理解新概念和新技术的旅程中!    旅途愉快!    Bjarne Stroustrup      
C程序设计语言(第2版)(丹尼斯里奇经典).pdf
C语言程序设计的经典基础教程,这边是由丹尼斯里奇编撰。
C primer plus(第五版)编程练习第六章
第一题:编写一个程序。创建一个具有26个元素的数组;并在其中存储26个小写字母。并让程序现实该数组的内容。 解: 代码如下: #include int main(void) {     char i,letters[26];     int j;          for(i = 'a',j = 0;i         letters[j] = i;     for(j
C++ 程序设计语言(特别版) ==C++之父Bjarne Stroustrup写的超经典的教科书
本书介绍了标准C++以及由C++所支持的关键性编程技术和设计技术。标准C++较以前的版本功能更强大,其中许多新的语言特性,如名字空间、异常、模板、运行时类型声明等使得新技术得以直接应用。本书围绕语言及库功能来组织,内容涉及C++的主要特征及标准库,并通过系统软件领域中的实例解释说明一些关键性的概念与技术。   本书的目的就是帮助读者了解C++是如何支持编程技术的,使读者能从中获得新的理解,从而成为一名优秀的编程人员和设计人员。适合做高校面向对象编程课程的教科书,也可作为C++爱好者的参考书。 这是一本特别的书,是世界上第一部关于C++的著作,是关于C++语言及其程序设计的最重要的著作,是在C++领域中地位无法替代的一部杰作。这是该书的最新版本,也最能反映最新的C++标准。
关闭