主要内容
● 使用C++快速构建面向对象程序
● 掌握C++的核心概念,如函数、类、数组和指针
● 使用链表和模板添加丰富的功能
● 调试程序以便获得完美无缺的代码
● 学习异常和错误处理技术
● 使代码符合ANSI以便重用
按照简明且循序渐进的阐述方式,读者可以从头开始领略C++的实质。
本书特点
■ 你知道吗? 指出捷径和解决方案的提示
■ 题外话 简明地阐述概念和过程的注释
■ 注意 帮助读者避免常见失误的警告
■ 问与答、测验和练习 在每章的最后,帮助读者加强对C++的理解
已经有超过250 000位读者跟随本书作者——JesseLiberty学习C++。
无
编写本书的目的是为了帮助读者学习如何使用C++进行程序设计。仅仅在24个学时的课程内, 你将学习管理I/O、 循环和数组、 面向对象编程、 模板以及创建C++应用程序等基础知识, 全部是结构良好并且易于理解的课程。这些课程提供范例代码清单——包括范例输出和代码分析——以便演示每一章的主题。本书清楚地标出了语法范例, 方便读者参考。
为了帮助读者更加精通C++, 每一章最后都设计一组常见问题和解答。
这一版本中全新的内容是“课外作业”部分, 它包括测验(带有测验答案)和练习。
谁应该阅读本书
学习本书不需要任何编程经验。本书从基本内容开始讲解, 并且同时讲授语言以及C++编程涉及的概念。一旦读者开始阅读本书学习, 就会发现大量语法范例以及对代码的详细分析是优秀的向导。不管是从头学起, 还是已经具有了一些编程经验, 读者都会发现本书具有清晰的组织结构, 使C++的学习变得快速而且简单。
是否应该先学习C语言
自然会有人提出这样的问题: 因为C++是C的扩充, 是否应该先学习C呢?Stroustrup(C++的发明者)和大多数其他C++程序员都同意:首先学习C不仅没必要, 而且是一个坏主意, 因为你可能会学到一些坏的习惯, 这些习惯是C++禁止使用的。本书假设读者不是C程序员。但是, 如果读者是C程序员, 也没有问题。阅读前几章来进行回顾, 然后继续下去。读者会发现C语言与C++有很大的不同。
为什么要学习C++
这是另一个常见的问题, 通常人们接着会说: “毕竟,x语言是最新和最好的,它将替代C++”。回答很简单:“并不是这样!”。很多语言都试图替代COBOL, 但是仍旧有成千上万行的应用程序使用COBOL语言(而且有更多的代码正在开发出来)。目前有很多应用使用C++, 并且越来越多。 即使你认为C++未来的前景黯淡, 仍然需要学习它, 因为很多“新的并且改进的”语言都来源于C++。Java和C#共享C++的语法, 但是它们在很多方面是难于学习的。
学习C++将帮助我们掌握类似的语言。不仅是Java和C#, 而且包括awk、 Perl,当然还有C。最重要的因素之一是学到了可以用在别处的技巧, 并且可以在当前任何平台上使用这些技巧: 从PC到大型的Unix系统, 再到数据中心大型机。现有代码可能不是真正可移植的(能够改换平台且无需改动), 而你现在学习的技巧正是可移植的!
本书使用的惯例
下面介绍本书包含的特殊内容:
这些图标突出能使C++编程更加有效和高效的信息。
注意:这些图标使你的注意力集中在特殊情况之下可能发生的问题和副作用上。
这些图标是关于当前主题的提示和附加信息。
要:该章中基本原则的简单总结。
不要: 不要忽略这些文字框中提供的有用的信息。
输出
下面的内容将显示代码清单/范例的输出。
分析
下面的内容是对读者刚刚阅读的代码范例的分析。
本书使用不同的字体:
▲ 为了帮助读者区分C++代码和其他常规内容, 实际的C++代码使用特别的代码体排版。
占位符——临时使用的词或者字符, 代表将在代码中输入的实际词或者字符——使用斜体字体排版。
▲ 新的或者重要的术语使用楷体字。
▲ 本书的清单中, 对每个实际的代码行都进行了编号。如果看到清单中没有编号的行, 就知道那实际上是前一编号的代码行的继续(相对于书籍的宽度, 一些代码行过长)。这种情况下, 应该把两行作为一行输入; 不要分开它们。
附带光盘的内容
附带光盘包括:
▲ 本书使用的全部清单范例。
▲ 来自Borland的免费编译器及其IDE: C++BuilderX。
全部代码范例都使用这个编译器测试过, 本书不讲解编译器。我们可以在任何健壮的C++编译器上使用本书包含的范例。需要注意的是: 并不是所有的编译器都是健壮的, 或者都符合最新的标准, 所以它们可能不能够编译某些范例。因为现有很多不同的编译器(以及不同的版本), 所以在这里我们不可能一一列出它们的区别。
▲ 在每一章的最后提供的很多练习的解决方案。
参与本书翻译工作的有: 马朝晖、 陈美红、 楼涵、 何运刚、 郑纪革、 李晓东、 裔彩霞、 张志刚、 迟旭 。
作者简介
Jesse Liberty曾写过最为畅销的关于C++和NET的书籍。他是Liberty Associates公司(http://wwwLibertyAssociatescom)的总裁, 该公司提供定制的编程、 咨询和培训服务。
David B Horvath, CCP是宾夕法尼亚州费城地区的高级顾问。他在这一领域工作超过15年, 并且是本地和远程教育大学讲授C++、 Unix/Linux和数据库技术的兼职教授。他于1998年从宾夕法尼亚大学获得组织动力学硕士学位。在国际范围内, 他为专业学会和公司提供技术讲座和专题讨论会。David是《UNIX for the Mainframer》(PrenticeHall/PTR)一书的作者、 《Sams Teach Yourself C++ for Linux in 21 Days》一书的合著者(与Jesse Liberty合著), 他对《Unix Unleashed》(多个版本)、 《Red Hat Linux Unleashed》(多个版本)、 《Learn Shell Programming in 24 Hours》、 《Linux Unleashed Fourth Edition》、 《Linux Programming Unleashed Second Edition》等书籍的编写做出了贡献, 他还撰写了大量的杂志文章, 同时是专业学会中活跃的志愿者。David的电子邮件地址是cppin24@cobscom。请不要发送垃圾邮件!
致谢
我们要在这里对所有对本书出版有帮助的人表示感谢。 没有他们的支持和帮助, 这本书简直是无法完成的。首先, 要感谢Stacey、 Robin和Rachel Liberty。
我还要感谢Sams、 Que、 O’Reilly以及Wrox公司中和这本书有关的每个人, 感谢他们最高质量的专业工作。Sams公司的编辑完成了了不起的工作, 并且我必须特别感谢Carol Ackerman、 Christy Franklin和Paul Strickland。特别感谢Rich Halpert。最后, 我希望感谢Kalish夫人, 她在1965年教授六年级的我如何进行二进制运算, 那时候不管是她还是我都不知道为什么。
——Jesse Liberty
除了Jesse感谢的人之外, 我很抱歉在这里无法一一提及Sams公司的很多员工。在这个项目上, 我跟Songlin Qiu和Loretta Yates进行了合作。
当然, 没有我的家人——特别是我妻子Mary——的支持和理解, 这本书是不可能面世的。我的家庭默默忍受了书籍项目给他们带来的痛苦, 因为实际上我只有在晚上和周末才有时间写这本书。
——David B Horvath
我们希望收到读者的反馈
作为本书的读者, 您是我们最重要的批评者和评论者。我们很重视您的意见并且希望了解我们做对了什么、 我们能够改进什么、 您希望我们出版什么领域的书籍, 以及希望传递给我们的任何意见。
作为Sams出版公司的合作出版者, 我欢迎您的评论。可以发送电子邮件或者直接写信给我, 使我了解您喜欢或者不喜欢本书的什么内容——还有为出版更好的书籍我们能够做出哪些努力。
请注意我不能帮助您解决和本书主题相关的技术问题。但是, 我会把和本书相关的专门的技术问题转给用户服务团队。
当您写信的时候, 请确保包括了本书的名称和作者, 还有您的姓名、 电子邮件地址和电话号码。我会仔细地阅读您的评论并且和参与本书的作者和编者分享它们。
电子邮件: feedback@samspublishingcom
邮件: Michael Stephens
Associate Publisher
Sams Publishing
800 East 96th Street
Indianapolis, IN 46240 USA
关于本书或者Sams出版公司的其他书籍的更多信息, 请访问我们的Web站点: wwwsamspublishingcom。在搜索区域输入书籍的ISBN号码(0672326817)或者书名查找您要搜索的页面。
Jesse Liberty, David B.Horvath, CCP:Jesse Liberty: Jesse Liberty著有大量有关软件开发的书籍,包括最为畅销的关于C++和.NET的书籍。他是Liberty Associates公司(http://www.LibertyAssociates.com)的总裁,该公司提供定制的程序设计、咨询和培训服务。
David B.Horvath, CCP: 是宾夕法尼亚州费城地区的高级顾问。他是《UNIX for the Mainframer》一书的作者、《Sams Teach Yourself C++ for Linux in 21 Days》一书的合著者(与Jesse Liberty合著),他对《Unix Unleashed》、《Red Hat Linux Unleashed》、《Learn Shell Programming in 24 Hours》、《Linux Unleashed》和《Linux Programming Unleashed》等书籍的编著做出了贡献,还撰写了大量的杂志文章。他还是专业社团中活跃的志愿者。
马朝晖 等:暂无简介
第一部分 C++概述
第1学时 开始
11 准备编程
12 澄清对C++、 ANSI C++、 ISO C++和Windows的一些观点
13 安装和设置编译器
131 从光盘进行安装
132 配置Borland C++BuilderX编译器
133 使用Borland C++BuilderX编译器进行编译
134 编译器和编辑器
14 编译和连接源代码
141 在集成开发环境中进行编译
142 连接程序
15 开发周期
16 HELLOCPP——第一个C++程序
17 编译错误
18 问与答
19 课外作业
191 测验
192 练习
193 测验答案
第2学时 C++程序的组成
21 为什么C++是正确的选择
211 过程化、 结构化和面向对象程序设计
212 C++和面向对象程序设计
22 简单程序的组成
221 逐字符地查看#include
222 逐行分析
23 注释
231 注释的类型
232 在简单的范例程序中使用注释
24 函数
241 调用函数
242 使用函数
243 使用带有参数的函数
25 问与答
26 课外作业
261 测验
262 练习
263 测验答案
第3学时 变量和常量
31 变量是什么
311 设置内存
312 整数的长度
313 带符号和无符号
314 基本变量类型
32 定义变量
321 区分大小写
322 关键字
33 一次创建多个变量
34 为变量赋值
35 typedef
36 何时使用短型, 何时使用长型
361 无符号整数的回绕
362 带符号整数的回绕
37 常量
371 文字常量
372 符号常量
38 枚举常量
39 问与答
310 课外作业
3101 测验
3102 练习
3103 测验答案
第4学时 表达式和语句
41 语句
411 空白字符
412 复合语句
42 表达式
43 操作符
431 赋值操作符
432 数学操作符
433 组合赋值和数学操作符
434 自增和自减操作符
435 放在前缀和后缀位置的操作符
436 优先级: 操作符的顺序
44 复杂表达式的嵌套括号
45 if语句
451 else子句
452 高级if语句
453 在嵌套的if语句中使用花括号
46 关于逻辑操作符的更多讲解
461 逻辑与
462 逻辑或
463 逻辑非
464 关系优先级
47 关于真和假的更多讲解
48 问与答
49 课外作业
491 测验
492 练习
493 测验答案
第5学时 函数
51 函数是什么
52 声明和定义函数
521 声明函数
522 定义函数
523 函数定义的说明
53 在函数内使用变量
531 局部变量
532 全局变量
54 函数参数
541 以函数调用作为参数
542 参数也是局部变量
55 从函数返回值
56 函数中的默认参数
57 重载函数
571 内联函数
572 堆栈和函数
58 问与答
59 课外作业
591 测验
592 练习
593 测验答案
第6学时 程序流
61 循环
611 循环的根源goto
612 为什么不使用goto
62 while循环
621 更复杂的while语句
622 continue和break
623 while(1)循环
63 dowhile循环
64 for循环
641 初始化、 测试和自增
642 高级for循环
643 空for循环
644 嵌套的循环
65 switch语句
66 问与答
67 课外作业
671 测验
672 练习
673 测验答案
第二部分 类
第7学时 基本的类
71 类型是什么
72 创建新的类型
73 类和成员
731 声明类
732 类的命名惯例
733 定义对象
734 类和对象
74 访问类成员
75 私有访问和公共访问
76 实现类方法
77 构造器和析构器, 即创建和删除对象
771 默认构造器
772 编译器提供的构造器
78 问与答
79 课外作业
791 测验
792 练习
793 测验答案
第8学时 关于类的更多讲解
81 const成员函数
82 接口和实现
83 把类声明和方法定义放在哪里
84 内联实现
85 使用其他类作为成员数据的类
86 问与答
87 课外作业
871 测验
872 练习
873 测验答案
第三部分 内 存 管 理
第9学时 指针
91 了解指针及其用途
911 在指针内存储地址
912 指针名称
913 间接操作符, 即间接使用指针
914 指针、 地址和变量
915 使用指针操作数据
916 检查指针内存储的地址
92 为什么要使用指针
93 堆栈和堆
931 使用new关键字
932 使用delete关键字
933 避免内存泄漏
94 问与答
95 课外作业
951 测验
952 练习
953 测验答案
第10学时 高级指针
101 在堆中创建对象
102 删除对象
103 使用指针访问数据成员
104 堆中的成员数据
105 this指针
106 迷失或者悬挂指针
107 const指针
1071 const指针和const成员函数
1072 const this指针
108 问与答
109 课外作业
1091 测验
1092 练习
1093 测验答案
第11学时 引用
111 什么是引用
112 创建引用
113 对引用使用取地址操作符
114 什么能够引用
115 空指针和空引用
116 按引用传递函数参数
1161 使用指针实现swap()
1162 使用引用实现swap()
117 理解函数头和原型
118 返回多个值
119 问与答
1110 课外作业
11101 测验
11102 练习
11103 测验答案
第12学时 高级引用和指针
121 按引用进行传递以提高效率
122 传递const指针
123 引用作为指针的另一种方式
124 何时使用引用和指针
125 不要返回不在范围内的对象的引用
126 返回堆中的对象的引用
127 谁拥有指针
128 问与答
129 课外作业
1291 测验
1292 练习
1293 测验答案
第四部分 强大的工具
第13学时 高级函数
131 重载的成员函数
132 使用默认值
133 在默认值和重载的函数之间进行选择
134 重载构造器
135 初始化对象
136 拷贝构造器
137 问与答
138 课外作业
1381 测验
1382 练习
1383 测验答案
第14学时 操作符重载
141 如何重载操作符
1411 编写自增函数
1412 重载后缀操作符
1413 前缀和后缀之间的区别
1414 operator+
1415 重载operator+
1416 操作符重载的局限性
1417 何时需要重载
1418 operator=
142 转换操作符
143 问与答
144 课外作业
1441 测验
1442 练习
1443 测验答案
第15学时 数组
151 数组是什么
152 数组元素
153 写入超出数组的结尾
154 栅栏错误
155 初始化数组
156 对象数组
157 多维数组
158 关于内存的讲解
159 指针数组
1510 在堆中声明数组
1511 指向数组的指针和指针数组
1512 指针和数组名称
1513 在堆中删除数组
1514 char数组
1515 strcpy()和strncpy()
1516 字符串类
1517 问与答
1518 课外作业
15181 测验
15182 练习
15183 测验答案
第五部分 继承和多态性
第16学时 继承
161 继承是什么
1611 继承和派生
1612 使用动物王国解释继承
1613 派生的语法
162 私有的和保护的
163 构造器和析构器
164 把参数传递给基类构造器
165 覆盖函数
1651 重载和覆盖
1652 隐藏基类方法
1653 调用基类方法
166 问与答
167 课外作业
1671 测验
1672 练习
1673 测验答案
第17学时 多态性和派生类
171 使用虚方法实现多态性
1711 虚成员函数如何工作
1712 不能用父类指针调用子类的方法
1713 限制
1714 虚析构器
1715 虚拷贝构造器
1716 虚方法的代价
172 问与答
173 课外作业
1731 测验
1732 练习
1733 测验答案
第18学时 高级多态性
181 单一继承的问题
182 抽象数据类型
1821 纯虚函数
1822 实现纯虚函数
1823 抽象的复杂层次结构
1824 什么类型是抽象的
183 问与答
184 课外作业
1841 测验
1842 练习
1843 测验答案
第19学时 链表
191 链表和其他结构
192 使用链表的实例研究
1921 责任的委托
1922 组件组成
193 关于链表
194 问与答
195 课外作业
1951 测验
1952 练习
1953 测验答案
第六部分 特 殊 主 题
第20学时 特殊的类、 函数和指针
201 静态成员数据
202 静态成员函数
203 类的包含
2031 访问被包含类的成员
2032 过滤对被包含成员的访问
2033 包含的代价
2034 按值拷贝和按引用拷贝
204 友元类
205 友元函数
206 指向函数的指针
2061 简写调用
2062 指向函数的指针数组
2063 把指向函数的指针传递给其他函数
2064 对指向函数的指针使用typedef
2065 指向成员函数的指针
2066 指向成员函数的指针数组
207 问与答
208 课外作业
2081 测验
2082 练习
2083 测验答案
第21学时 预处理器
211 预处理器和编译器
212 查看中间形式
213 使用#define指令
2131 对常量使用#define
2132 使用#define和#ifdef进行测试
2133 #else预处理器命令
214 包含和包含防护
2141 在命令行上进行定义
2142 反定义
2143 条件编译
215 宏函数
2151 为什么总需要括号
2152 宏与函数和模板
216 字符串操作
2161 字符串化操作符
2162 串联操作符
217 预定义宏
218 问与答
219 课外作业
2191 测验
2192 练习
2193 测验答案
第22学时 面向对象分析和设计
221 开发周期
222 模拟一个警报系统
2221 概念化
2222 分析和需求
2223 高层和底层设计
2224 其他对象
2225 类是什么
2226 如何报告警报
2227 事件循环
223 PostMaster:案例研究
2231 两次衡量, 一次分隔
2232 分治
2233 消息格式
2234 初始类设计
2235 有根的层次结构和无根的层次结构
2236 设计接口
2237 构建原型
2238 80/80原则
2239 设计PostMasterMessage类
22310 应用程序编程接口
22311 大型团队中的编程
22312 开发中的设计考虑
22313 使用驱动程序
224 问与答
225 课外作业
2251 测验
2252 练习
2253 测验答案
第23学时 模板
231 模板是什么
232 模板实例
233 模板定义
234 使用模板项
235 标准模板库
236 问与答
237 课外作业
2371 测验
2372 练习
2373 测验答案
第24学时 异常、 错误处理及其他
241 缺陷、 错误、 事故和代码失败
242 处理没想到的情况
243 异常
244 使用try和catch块
2441 捕获异常
2442 多个catch规范
2443 按引用捕获和多态性
245 编写专业品质的代码
2451 花括号
2452 长行
2453 switch语句
2454 程序文本
2455 标识符名称
2456 名称的拼写和大写字母开头
2457 注释
2458 访问
2459 类定义
24510 include文件
24511 assert()
24512 const
246 其他资源
2461 在哪里获得帮助和建议
2462 推荐书籍
247 问与答
248 课外作业
2481 测验
2482 练习
2483 测验答案
第七部分 附 录
附录A 二进制和十六进制
附录B 术语表