本书将带你领略C++作为工业编程语言的强大威力。\r\n 全书分四个部分共23章。第一部分“语言”(第1章~第5章)从面向对象的角度讲解了C++的相关语言知识。第二部分“技术”(第6章~第13章)介绍了许多实用的工业强度的编程技术,如清理、隐藏实现细节、资源管理、重载运算符等技术。第三部分“Windows”(第14章~第18章)探讨了编写和维护Windows应用程序的相关知识,是本书的特色部分。第四部分“知识扩展”(第19章~第23章)在以前所学知识的基础上进一步对软件设计策略、团队协作开发、平台移植等内容进行简单介绍。\r\n 附录A提供了第一部分内容中部分练习的答案。附录B介绍了事务处理相关知识。\r\n 本书适合于不同层次的C++程序员,无论是初学者还是高级程序员都可从中汲取有用的C++知识营养。
第一部分 语言\r\n\r\n第1章 对象和作用域 3\r\n\r\n1.1 全局作用域 3\r\n1.2 本地作用域 8\r\n1.3 嵌入对象 14\r\n1.4 继承(Inheritance) 16\r\n1.5 成员函数和接口 18\r\n1.6 成员函数作用域 20\r\n1.7 类型 26\r\n1.7.1 小结 27\r\n1.7.2 练习 28\r\n1.8 抽象数据类型 30\r\n\r\n第2章 数组和引用 35\r\n\r\n2.1 引用 35\r\n2.2 运算符 40\r\n2.2.1 算术 41\r\n2.2.2 逻辑 42\r\n2.2.3 位逻辑运算符 43\r\n2.3 基于堆栈的计算器 44\r\n2.3.1 外部规范 44\r\n2.3.2 设计 44\r\n2.3.3 简短的实现 45\r\n2.3.4 实现 49\r\n2.3.5 练习 54\r\n\r\n第3章 指针 55\r\n\r\n3.1 指针的不利之处 55\r\n3.2 指针与引用 56\r\n3.3 指针与数组 57\r\n3.3.1 谈谈汇编 60\r\n3.3.2 练习 61\r\n3.4 指针与动态内存分配 62\r\n3.5 动态数据结构 65\r\n3.5.1 动态堆栈 65\r\n3.5.2 链表 68\r\n3.5.3 字符串表 74\r\n3.5.4 字符串缓冲器 76\r\n3.5.5 表查找 78\r\n3.5.6 哈希表 79\r\n3.5.7 测试程序 81\r\n3.5.8 练习 81\r\n\r\n第4章 多态 83\r\n\r\n4.1 is-a的意义 83\r\n4.1.1 谈谈实现 84\r\n4.1.2 开销 85\r\n4.2 解析树 86\r\n4.2.1 谈谈C 90\r\n4.2.2 练习 93\r\n\r\n第5章 一个小型软件项目 94\r\n\r\n5.1 开始一个软件项目 94\r\n5.1.1 设计规范 94\r\n5.1.2 简短实现代码 96\r\n5.1.3 扩展程序片断 98\r\n5.2 扫描器 102\r\n5.3 符号表 107\r\n5.4 存储 109\r\n5.5 函数表 112\r\n5.6 节点 118\r\n5.7 解析器 120\r\n5.8 主函数(main) 127\r\n5.9 聚集初始化 129\r\n5.10 过程化编程 131\r\n5.11 运算符重载 132\r\n5.12 按值传递 133\r\n5.13 值语义 137\r\n\r\n第二部分 技术\r\n\r\n第6章 清理 147\r\n\r\n6.1 输出解耦 147\r\n6.2 与“防错性编程”作斗争 150\r\n6.3 完备性编程的一个实例 152\r\n6.4 补充 156\r\n6.5 改进类之间的通信 157\r\n6.6 更正设计缺陷 161\r\n\r\n第7章 隐藏实现细节 168\r\n\r\n7.1 使用嵌入类 168\r\n7.2 组合类 170\r\n7.3 使用名字空间组合 171\r\n7.4 在枚举中隐藏常量 173\r\n7.5 在本地变量中隐藏常量 175\r\n\r\n第8章 共享 176\r\n\r\n8.1 分离全局程序参数 176\r\n8.2 增强包容性 176\r\n8.3 模板 179\r\n\r\n第9章 去掉限制 184\r\n\r\n9.1 动态数组 184\r\n9.1.1 动态MultiNode 188\r\n9.1.2 动态StringBuffer 189\r\n9.1.3 动态SymbolTable 191\r\n9.1.4 动态Store 192\r\n9.2 标准矢量 193\r\n\r\n第10章 资源管理 198\r\n\r\n10.1 异常 199\r\n10.2 堆栈展开 201\r\n10.3 资源 205\r\n10.4 资源所有权 206\r\n10.5 访问资源 207\r\n10.6 智能指针 207\r\n10.7 所有权转移:第一次尝试 209\r\n10.8 所有权转移:第二次尝试 210\r\n10.9 安全容器 216\r\n10.10 迭代器 220\r\n10.11 错误传播 222\r\n10.12 转换到资源管理 224\r\n10.13 结论 225\r\n\r\n第11章 使用标准模板库 226\r\n\r\n11.1 引用计数以及即写即复制 230\r\n11.2 结束限制 236\r\n11.3 去掉C-字符串 237\r\n11.4 探讨流 239\r\n\r\n第12章 持久性 243\r\n\r\n12.1 Calculator对象 243\r\n12.2 命令解析器 246\r\n12.3 串行化与反串行化 249\r\n12.4 内存中的串行化及反串行化 259\r\n12.5 多重继承 260\r\n\r\n第13章 重载运算符new 262\r\n\r\n13.1 特定类new 262\r\n13.1.1 缓冲 262\r\n13.1.2 批量分配 266\r\n13.1.3 数组new 269\r\n13.2 全局new 269\r\n13.3 跟踪内存泄漏 271\r\n13.3.1 调用输出 276\r\n13.3.2 方位new 276\r\n13.4 结论 277\r\n\r\n第三部分 Windows\r\n\r\n第14章 库 281\r\n\r\n第15章 编程范例 283\r\n\r\n15.1 Hello Windows 284\r\n15.2 封装 290\r\n\r\n第16章 通过C++控制Windows 292\r\n\r\n16.1 模型-视图-控制器 292\r\n16.1.1 控制器 298\r\n16.1.2 客户代码 299\r\n16.2 异常定义 301\r\n16.3 清理 302\r\n\r\n第17章 绘图 304\r\n\r\n17.1 应用程序图标 304\r\n17.2 窗口绘图和视图对象 308\r\n17.3 画布 309\r\n17.4 WM_PAINT消息 312\r\n17.5 模型 314\r\n17.6 捕获鼠标 317\r\n17.7 添加颜色和修饰 323\r\n\r\n第18章 一个Windows应用程序 331\r\n\r\n18.1 把计算器移植到Windows环境下 331\r\n18.2 用户界面 332\r\n18.3 子窗口 333\r\n18.4 Windows控件 334\r\n18.4.1 静态文本 335\r\n18.4.2 编辑控件 335\r\n18.4.3 窗口子类 336\r\n18.4.4 插入计算器 337\r\n18.4.5 列表框控件 337\r\n18.4.6 模块-视图反馈环 338\r\n18.5 命令和菜单 341\r\n18.6 动态菜单 343\r\n18.7 对话框 350\r\n\r\n第四部分 知识扩展\r\n\r\n第19章 关于软件 359\r\n\r\n19.1 复杂性 359\r\n19.2 软件的分形本质 361\r\n19.3 项目的灵活性 363\r\n19.4 程序员的灵活性 364\r\n\r\n第20章 设计策略 366\r\n\r\n20.1 自顶向下的面向对象设计 366\r\n20.2 用户界面 367\r\n20.3 需求规范 368\r\n20.4 体系结构规范 369\r\n\r\n第21章 团队工作 370\r\n\r\n21.1 生产效率 370\r\n21.2 团队策略 372\r\n\r\n第22章 实现策略 374\r\n\r\n22.1 确定全局 374\r\n22.2 自顶向下的面向对象实现方法 376\r\n22.3 程序修改 376\r\n22.4 代码继承 377\r\n22.5 多平台开发 378\r\n\r\n第23章 移植 379\r\n\r\n23.1 创建一个抽象层 379\r\n23.2 移植计算器 380\r\n23.2.1 消除简单的Windows依赖性 380\r\n23.2.2 特殊Windows依赖性 382\r\n23.3 移植的好处 383\r\n\r\n附录\r\n\r\n附录A 练习答案 387\r\n附录B 事务处理 404\r\n\r\n索引 414
我将本书分成4部分:语言. 技术. Windows和知识扩展. 下面简要描述每部分的目标和结构.
语言
本书的第一部分重点讲解作为通用目的编程的C++语言, 然而这不是你常见的C++指导.
对于那些对C或C++知之甚少的初学者来说, 本部分内容只是作为一种面向对象的语言介绍了C++(尽管C++的内涵远非如此). 本部分没有重点介绍语法或语法规则, 它只是说明如何在C++中表达一定的思想, 就像通过对话而不是背单词和语法规则来学习一门外语一样(当我给学生授课时, 我称这部分内容为“对话式 C++”). 毕竟这是程序所需要的:能以特定语言编写程序的形式来表达自己的思想. 当我学习一门外语时, 我想知道的第一件事就是如何使用这样的问句“How much does it cost?”我不需要学习“cost”的过去时. 现在时及将来时的所有动词时态, 我只希望能在国外顺利地购物.
对于一个不太了解C++的C程序员来说(不等于说C++不活跃. 很神秘, 但C的其他一些于集往往有这种弊病), 这是一个忘记 C. 有效运用C++编程的练习机会. 为什么要忘记C?C++不是C的一个超集吗?的确C++是C的一个超集, 让C++与C兼容完全是一个符合实际市场决策, 而且这样做取得了成功!它不是一个全新的产品, 它不必花费十年的时间来单独开辟市场, 它是“ 3.1版本”的C. 这样做也是利弊相随的. “利”在于 C++及一些面向对象的编程元素与C向后兼容, 这样可以迅速在编程领域占领一席之地“弊”在于它并不需要程序员更改编程习惯.
不必一次性重写所有的现有代码, 许多公司可以逐步过渡到C++, 现在很多公司仍然如此. 通常的过渡方式就是将C++当成一种“更严格”的C来引入. 从原则上讲, 所有的C代码都可以作为C++代码重新编译. 实际上, C++有着更严格的类型检查, 而且编译器可以检测到更多的错误. 发出更多的警告. 所以, 使用C++编译器重编译C代码是一个清理现有代码的好办法. 在此阶段对源代码要做的修改主要是更正错误. 实施更严格的类型. 如果代码是用前ANSIC写成的, 则会生成所有函数的原型. 在这一ANSI化的过程中发现的错误之多让人感到吃惊. 为了顺利过渡, 以上所有工作都是值得的. 只有在缺少优秀的C++编译器时(当然这种情况很少发生)人们才去使用C编译器.
一旦过渡到C++编译器环境中后, 程序员迟早要学习一些新技巧, 并最终开发一些C++编程方法(或通过自学. 阅读一些辅助性书籍来达到目的). 但此时, 许多程序员会受到一些不良的影响. 因为C++的一些子集是许多原来C程序员应用过的(我将此子集称做为“C特区”). 许多C程序员看到这些“ C特区”后开始憎恨C++, 但他们并没有意识到C++同样具有很多优秀之处.
在本书的前言中, 我想澄清一件事. 对于一个“C特区”程序员来说, 本书对他们应该是一种冲击(我希望如此). 从本质上讲, “你到目前为止所做的一切都是错的”. “ Kemighan和 Ritchie并非神”(Brian Kernighan和Dennis Ritchie是C的创建者, 也是著名的The C Programming Language一书的作者). 我知道, 这类程序员的第一个自然反应就是合上本书立即要求退款. 不要冲动!本书打破习俗的用意不在于伤害某个人的感情, 而在于以一种不同的哲学思维来提醒读者重新思考他们的信条.
对于C++程序员来说, “语言”部分提供了一个审视C++的新角度. 它演示了如何避免C++的缺陷以及如何根据先设计后具体实现的方式来应用这一语言. 如果我说C++是一种优美的编程语言, 这是不真实的. 但它即将成为编写正规软件的最流行语言(至少在某些时候是). 我们最好充分利用它的丰富表达力来编写更出色的软件而不是用它不利的一面来伤害我们自己. 对于一个C++程序员来说, 这一部分内容不难读懂. 而且, 虽然这里介绍的结构和技术已广为人知, 我还是尽量从不同的角度来展示它们. 我的主导思想是创建一个易于维护. 可读性强的系统. 这就是为什么我抓住每一次机会不仅演示不同的编程选择, 而且还解释为什么优先考虑某种方案的原因.
最后, 对于一个Java程序员来说, 他们可以利用本书来扩展知识. 事实表明, 根据一定的原则, 利用C++可以编写出安全和可靠的代码. Java能做到的, C++也能做到, 而且能做得更多. 另外, C++能提供无可匹敌的操作性能.
然而操作性能不是投身C++的唯一原因. 完善的资源管理在C++中能实现, 但在Java中不可能实现, 因为Java要依赖于垃圾口收机制. 在C++中, 你可以创建这样的对象:它的生存期由它所在的作用域准确定义. 在退出这些作用域时, 你要保证这些对象将被销毁. 这就是为什么你可以让C++对象作为一个信号量来负责处理这些重要资源(如文件句柄. 数据库事务处理等等)的原因. Java对象有一个未定义的生命期——只是在运行时决定回收它们时才释放这些资源. 所以, 说到Java中处理资源的方式就得重提旧式C的异常范例, 在这种情况下, 最后的子句必须要进行痛苦的显式垃圾回收.
没有“纯粹” C++出身的程序员. 当我们“谈到” C++时, 或多或少都会涉及其他一些编程背景. 我们中间的一些人有着深厚的C背景, 一些人使用类似Smalltalk的表达方式, 还有一些人在使用LISP. “语言”部分的目标是尽可能让你成为一名正统的C++程序员. 语言是表达思想的一种工具. 所以, 我的讲解重点不是语法而是程序员表达自己的方式. 在这里不是介绍“ C++的结构是什么, 你应该怎么用”, 而更多的是以“我们有了一种思想, 那么该怎样用C++来表达呢?”的方式来讲解. 最初, 这一“思想”可能以“星球是一种天体”或“一个难栈允许你用推入或弹出数据”的简单句子形式表达, 以后再将这些句子组成“段落”和“章”来描述软件组件的功能. 在需要解决相关问题的适当场合介绍不同的C++结构.
技术
开发优秀软件不仅仅需要了解语言本身. 首先, 程序不是在真空中执行, 它必须与计算机交互作用. 交互意味着通过操作系统来发挥作用. 若对操作系统一无所知, 就不可能编写出像样的程序. 其次, 我们不仅需要编写能运行的程序, 我们还希望程序小巧. 快速. 可靠. 强健以及具有扩展性. 第三, 我希望在合理的时间内完成程序的开发, 并且能在以后维护和改进此程序.
本书第二部分“技术”的目标是让你从“业余编程”过渡到“工业强度型编程”. 我描述了一些可以使程序更强健. 维护性更强的C++编程技术. 其中的“资源管理”重在介绍程序的创建. 获取. 拥有及释放各种资源. 在程序执行的任一时刻, 每一种资源都必须存在一个明确的拥有者负责释放它. 这一简单的思想在设计和维护复杂的软件系统中相当有用. 运用资源所有权关系分析法可以避免. 发现和排除许多bug.
资源管理与C++异常处理能自然地吻合. 事实上, 如果不封装资源几乎不可能使用异常来编写合理的C++程序. 那么, 什么时候使用异常呢?它们能为我们做些什么呢?这取决于你对下面简单问题的回答:你总是检查new的结果吗(或者对于C程序员来说就是检查malloc的结果)?这是一个反问句. 除非你是一个格外小心的程序员, 你才不用这样!这意味着不管你希望与否, 你都已经使用了异常, 因为访问一个空指针就会导致一个叫做“一般性保护”(程序员也称做GP过错或访问违例)的异常. 如果你的程序没有添加防异常措施, 当它遇到这种异常时就会死机. 甚至操作系统会弹出一个消息框, 证实你的应用程序所使用的技术不合格.
我的观点是, 为了编写强健可靠的应用程序, 使用异常是最终的选择——这也是本书的目的. 当然, 还有其他一些可成功地应用于开发强健可靠应用程序的编程技术(这些技术现在仍然被我们使用). 不过, 结合应用C++异常与资源管理带来的简单性和可维护性是这些技术所不及的.
Windows
就我所知, 这是第一本深入探讨了使用现代C++进行Windows编程的书籍. 事实是Windows API很混乱, 现有的库也同样不是完全规范一致, 使得Windows应用程序的编写不是那么简单, 但这并不意味着这一主题就没有意义. 在C++类. 名宇空间及模板中封装Windows API是一种挑战, 这需要对整个Windows范例的重新深层构思.
这部分内容的主要目标是探讨创建和维护Windows程序的简单途径——更侧重于维护. 我常常问我自己这样的问题:“添加或修改一个消息句柄应该简单到什么程度?添加一个新菜单项. 一条命令. 一个对话框呢?而且如何才能将程序员犯错的可能性降到最低呢?”最后, 还要考虑将库移植到例如像Linux的其他平台上(但这不是必需的).
本书的Windows部分反映了一个不断改进的工作. 事实上, 这一工作多少年来一直在不断改进. 对本部分所描述的每一个思想都有若干种不同的实现方法, 并进行了测试(通常集成在某一产品中), 也可能由于找到了更好的方案而最终放弃了.
知识扩展
在这一部分内容中, 我涉及了软件开发的许多扩展知识. 我侧重讨论软件项目的动态性, 既从管理和规划的角度入手, 同时着眼于开发策略和技巧. 我从软件项目的概念到发行描述了其动态性. 我讨论了文档. 设计过程以及开发过程. 不过, 我不想提供一个现存的方案, 因为这样的方案不会在任何时候都适用——原因如下所述.
成功开发一个应用程序(或系统)不是光靠学习一种语言. 掌握其一定的技术就足够了. 当今的商业软件项目是人类从事的最为复杂的工程之一. 编程实质上是一门处理复杂性的艺术. 很多人尝试使用传统的工程方法来控制软件的复杂性, 模块化. 软件重用. 软件IC( integrated circuit, 集成电路)等等——但我们要面对这样的事实:通常它们不能正常发挥作用. 它们可能对提供低层构建块和库非常有用, 但它们很难用作设计和实现复杂软件项目的指导原则.
原因很简单:软件块中的重复很少. 试着比较一段程序的打印输出与一幅微处理器晶片图, 你可以发现微处理器布局上的许多重复模式. 这些重复块仿佛某种高科技晶体. 另一方面, 精简后的程序看起来更像一个高科技分形结构. 你可以见到许多相似性——大模式与小模式相似. 但你很少发现有完全准确的匹配或完全相同的重复. 每个小块都像一个单独的手工艺品. 程序中的重复不仅没有必要, 而且还会给令后的维护带来困难. 如果你修改某段代码或排除某个错误, 你就要审查这一段代码的所有拷贝, 而且还要同时对这些地方做出修改.
重复的弊病还反映在软件的生产过程中. 软件工业中的研究. 设计和制造不同于其他工业. 例如制造的作用并非主导. 严格说来, 电子化发行渠道可以使制造阶段与之完全无关. R&D(研究与开发)扮演着重要角色, 这一点比许多其他工业更突出. 但真正区别软件开发与其他工业的是在产品中体现的设计成分. 编程就是设计. 设计. 构建原型, 一遍遍地测试. 软件工业是最终的“设计工业”.
程序员在人们心中往往是这样一种灰色形象:独自夜战. 封闭自我而且生活邋遢. 我认识这样的程序员, 但我仍然相信还有另一类程序员. 这种旧文化的残留现在逐渐灭绝了, 因为硬件的进步. 软件的发展使得孤军奋战开发出有用的可靠程序已不可能. 团队工作是软件开发必不可少的.
分解整个工作并在团队工作中协作努力总是一个大的挑战. 在传统工业中, 团队中的成员知道(至少在理论上)他们要做什么. 他们知道例行程序. 他们听着音乐, 知道下面的步伐, 并跳出同步的舞蹈. 在软件工业中, 团队成员即兴跳出舞步, 同时为其余的队友谱出相应的“音乐”.
我提倡改变软件开发的重心. 我将尽量让你信服这样的思想“程序是为程序员而写的”, 而不应该遵循陈旧的“程序是为计算机而写的”的思想. 这一论点是整本书的基点. 如果你不把你编写的代码看作让其他程序员阅读. 理解和修改的出版物, 那么你就不可能开发出工业强度型软件. 没有人希望自己编写的代码成为一段密码. 计算机可以编译和运行你的程序, 还要求你的同事可以理解它的意义. 而且至关重要的是, 只需极少的努力就可完成这一点, 因为不理解代码就不可能开发和维护软件.
如何使用本书
缺乏足够的经验不可能学好编程. 这是为什么本书附带光盘中包含所有源代码及相关软件的原因, 它们可以供读者进行练习. 如果你安装了我推荐的编译器之一, 你就可以构建和运行本书涉及的所有程序. 尤其是开始的一些例子以一套文件的形式提供给大家, 它们保存在各自的目录中. 你可以从光盘将这些文件复制到本地硬盘中并编译它们. 不过, 大部分例子需要一个版本控制系统.
版本控制系统
本书中的大部分代码示例属于一个软件项目, 随着讲解的深入, 这些代码得到了一步步的改进. 提供这些逐级改进版本的最佳途径就是使用一个版本控制系统( version control system, VCS). VCS是软件开发的基本工具之一. 它可以让你跟踪所有的变化. 恢复到旧版本, 而且更重要的是, 可以与其他程序员相互协作.
随书光盘上赠送了 Reliable Software公司开发的一种VCS, 这就是 Code Co-op. 因为VCS是一个商业产品, 所以通常你要购买使用许可证才能使用. 不过, 把它作为一个项目的“观察器”使用就不必获得使用许可证, 而且这已足以让你学习本书中的项目了.
Code Co-op有一些独特的功能, 因此尤其适合于本书的学习. 在安装 Code Co-op的过程中, 将你的计算机作为一个单机来配置. 接下来, 你就可以在学习软件项目过程中与我“交互协作”了. 这种协作是单方面的:我开发了此项目, 你将得到了同步脚本复制, 它们描述了代码所作的修改.
注意, 安装Code Co-op不会覆盖计算机系统中的任何 DLL文件. 运行卸载程序后 Code CO-op将从你的计算机上彻底消失.
编译器
在本书成稿之时, 集成了性能良好的IDE(Interactive Development Environment, 交互式开发环境)的标准兼容 C++编译器并不多. 我已经用 Metrowerks CodeWarrior 6. 0和 Microsoft Visual C++ 7. 0 betal测试过了所有的示例代码(这些代码不能保证与早期的VC++版本兼容).
我为两种编译器提供了相关的项目文件. 如果你使用的是Codewarrior, 则使用扩展名为. mop的文件作为项目文件. 如果使用的是 VC++ 7.0, 则使用扩展名为. vcproj的文件代替.
安装以上任何一种编译器之后, 双击项目文件就可以打开它. 然后可以浏览源文件和构建项目(使用“ Build”按钮). 构建项目后, 你可以运行得到的可执行文件(使用“ Run”按钮). 两种IDE都有内置调试器, 它们不仅有助于调试程序, 而且可用于(单步)跟踪代码.
代码示例
world
当可以在光盘_上找到本书所讨论编程例子的源代码时, 本书就会以边注(一个光盘图标加上对应的目录名)的形式指出它们在光盘上的对应位置. 例如, 当你看到边注“worldl”时, 你就可以查找光盘上src目录下的于目录worldl, 得到相应的源代码(在光盘的启动界面上点击“Source code”链按可进入src目录). 将此目录下的内容复制到本地硬盘上, 然后可以构建井运行它.
Project Calculator
不断开发改进的示例代码以Code Co-op项目的形式提供. 当你看到一个指定了项目名的边注时就可以启动一个新项目. 例如, 当你看到边注“ProjectCalculator”时, 就可以放入光盘, 点击启动圆面上的“Create a Project form the book”, 接着出现一个项目列表, 从列表中选择项目“ Calculator”之后, 你就进入了此项目, Code Co-op会显示项目的初始状态. 在“文件区”(Files Area)双击文件可以查看它的内容.
Script
在 Code Co-op的“邮箱区”(Mailbox Area)你可以看到许多与不断增加的代码修改对应的同步脚本. 每个脚本都有一个编号. 当看到一个指定了脚本编号的边注时, 你就可以在光盘上打开对应的脚本. 例如, 当你看到一个边注“Scriptl”时, 你就应该正在学习项目“Calculator”, 你可以进入Code Co-op的“邮箱区”打开标题为“1. Implemented Scanner”的脚本链接(此脚本将被标记为“Next”. 打开“Scriptl”后, “SCript 2”也被标记为“Next”表示下一个可打开对象, 依此类推). 按下倒置的信封图标按钮可以完成打开.
打开某个脚本后, 你可以直观地看到对此项目所作的修改. 在Code Co-op的“同步区”(Synch Area)可以看到一个更改文件列表. 当你双击这样一个文件时, 你将看到加亮了修改处的不同视图. 当你审查完代码后, 通过点击“同步”区的“accept Changes in all files”按钮接受这一同步修改.
如果你想体验某个版本的项目, 你可以将这一项目版本的文件导出到硬盘上的一个单独目录中再来修改它们. 进入Code Co-op的“历史区”(History Aiea), 选择你想导出的版本(它可能是当前版本)并从“Selection”菜单中选择“Export Version”.
从Code Co-op的“ Help”菜单中可获得更详细的帮助信息.
排版约定
本书中的所有代码示例均以等宽字体印刷, 如:
int main(){}
代码示例中的一些元素以黑体来强调:
World smallworld,
这些需要强调的元素通常是在上下文中进行讨论的新添加元素.
类. 变量或函数的名字(如World. smallWorld. main)在正文中以Times New Roman字体印刷. 文件名也使用了同样的字体, 如world. cpp.