新書推薦:
《
中国国际法年刊(2023)
》
售價:NT$
539.0
《
早点知道会幸福的那些事
》
售價:NT$
295.0
《
迈尔斯普通心理学
》
售價:NT$
760.0
《
古典的回響:溪客舊廬藏明清文人繪畫
》
售價:NT$
1990.0
《
掌故家的心事
》
售價:NT$
390.0
《
孤独传:一种现代情感的历史
》
售價:NT$
390.0
《
家、金钱和孩子
》
售價:NT$
295.0
《
量价关系——透视股票涨跌脉络
》
售價:NT$
340.0
|
編輯推薦: |
0 零起点,不要求数字逻辑知识铺垫。
一 结构清晰,概念严谨,注重本质层面讨论。
二 内容新颖,贴近应用。
三 深入浅出,容易梳理,适合教与学。
|
內容簡介: |
本书以C 命令式编程为基础,深入介绍C 面向对象编程的有关机制,并将应用落实到泛型编程上,力求充分彰显C 多范型的特色。全书将9章内容分为3篇。 第1篇:C 命令式编程。用4章内容帮助初学者建立命令式编程的基本原理和方法。 第2篇:C 面向对象编程。用3章内容介绍C 的类、继承和多态,并引入设计模式的思想,进一步提升读者“程序设计 = 计算思维 语言艺术”的观念。 第3篇:C 泛型程序设计。用2章分别介绍模板和STL。 本书结构清晰,以彰显C 多范型程序设计的特色;概念精确,可引导读者透过现象看本质,准确把握C 语法;例题经典、习题丰富,书中有多个二维码形式的知识链接,为读者提供了操作训练、扩展视野的学习环境。书中还介绍了C 11的重要新特性。 本书适合作为高等院校各专业面向对象程序设计的教材,也可供培训机构使用,以及相关领域人员自学。
|
關於作者: |
张基温,江南大学教授,长期从事程序设计等教学工作。曾担任中国计算机学会教育专业委员会委员,全国高校计算机基础教育研究会常务理事、学术委员会副主任、课程建设委员会副主任等。
|
目錄:
|
第1篇 C 命令式编程
第1章 C 起步 3
1.1 初识C 3
1.1.1 C 程序的编译与连接 3
1.1.2 C 程序的基本结构 4
1.1.3 C 程序的编译与执行过程概况 5
1.2 C 基本数据类型 6
1.2.1 C 基本类型的存储规格与sizeof运算符 7
1.2.2 C 基本类型的存储格式 8
1.2.3 C 整数类型 9
1.2.4 char类型 11
1.2.5 C 浮点数类型 12
1.3 C 变量、引用与指针 13
1.3.1 C 变量及其声明 13
1.3.2 C 变量赋值:赋值运算符与提取运算符 14
1.3.3 语句块与变量的作用域 15
1.3.4 引用变量 16
1.3.5 指针变量 17
1.3.6 C 保留字与标识符 20
1.4 C 运算符 21
1.4.1 C 运算符的种类 21
1.4.2 几个需要特别说明的C 运算符 21
1.4.3 运算符的优先级与结合性 25
1.5 数组、字符串与构造体 26
1.5.1 数组 26
1.5.2 字符串 29
1.5.3 构造体 33
习题1 35
第2章 C 函数 40
2.1 C 函数基础 40
2.1.1 函数定义、调用与返回 40
2.1.2 函数声明、函数原型与头文件 42
2.1.3 函数内联 44
2.2 C 函数参数技术 44
2.2.1 值传递、地址传递与左值引用传递 45
2.2.2 const保护函数参数 48
2.2.3 形参带有默认值的函数 49
2.3 C 函数返回技术 50
2.3.1 C 函数返回的基本规则 50
2.3.2 函数返回引用 51
习题2 52
第3章 C 变量的访问属性 55
3.1 C 变量的生命周期与存储分配 55
3.1.1 C 变量的生命周期 55
3.1.2 C 存储分配 56
3.1.3 动态内存分配 57
3.2 C 标识符的作用域与连接性 59
3.2.1 作用域与连接性的概念 59
3.2.2 全局变量与extern关键字 61
3.2.3 C 的static关键字 64
3.2.4 C 变量存储属性小结 66
3.3 C 名字空间域 67
3.3.1 名字空间及其创建 67
3.3.2 名字空间的使用 68
3.3.3 C 特别名字空间 70
习题3 72
第4章 C 语句流程控制 78
4.1 选择结构 78
4.1.1 if-else语句 78
4.1.2 switch语句 83
4.2 重复结构 85
4.2.1 while语句与do-while语句 85
4.2.2 for语句 88
4.2.3 break语句与continue语句 90
4.3 递归 92
4.3.1 递归的概念 92
4.3.2 阶乘的递归计算 93
4.3.3 汉诺塔 95
4.4 C 异常处理 98
4.4.1 程序错误与异常 98
4.4.2 C 异常处理机制 100
4.4.3 C 异常处理技术 101
习题4 104
第2篇 C 面向对象编程
第5章 类与对象 111
5.1 类的设计 111
5.1.1 类的声明与实现 111
5.1.2 信息隐藏原则与类成员的访问控制 112
5.1.3 构造函数与析构函数 113
5.1.4 对象的动态存储分配 118
5.1.5 set类函数、get类函数与this指针 119
5.2 对象行为控制与类定义延伸 122
5.2.1 const修饰类成员与对象 122
5.2.2 static成员 124
5.2.3 友元 127
5.3 运算符重载 131
5.3.1 运算符重载概述 131
5.3.2 加操作符( )重载 132
5.3.3 增量操作符( )重载 134
5.3.4 用友元函数实现插入操作符(<<)重载 136
5.3.5 操作符重载的基本规则 137
5.4 对象复制 139
5.4.1 隐式复制构造函数与浅复制 140
5.4.2 显式复制构造函数与深复制 143
5.4.3 赋值运算符重载 144
5.5 类型转换 144
5.5.1 C 算术类型转换 144
5.5.2 对象转类与explicit关键字 147
5.5.3 3种构造函数的区别 149
习题5 151
第6章 继承 157
6.1 单基继承 157
6.1.1 C 中的派生与继承 157
6.1.2 在派生类中重定义基类成员函数 161
6.1.3 基于血缘关系的访问控制——protected 163
6.1.4 类层次结构中构造函数和析构函数的执行顺序 164
6.2 类层次中的赋值兼容规则与里氏代换原则 167
6.2.1 类层次中的类型赋值兼容规则 167
6.2.2 里氏代换原则 168
6.2.3 对象的向上转换和向下转换 168
6.3 多基继承 169
6.3.1 C 多基继承语法 169
6.3.2 多基继承的歧义性问题 171
6.3.3 虚拟基类 173
6.4 用虚函数实现动态绑定 174
6.4.1 画圆、三角形和矩形问题的类结构 174
6.4.2 虚函数与动态绑定 175
6.4.3 虚函数表与虚函数规则 177
6.4.4 override和final 179
6.4.5 纯虚函数与抽象类 181
6.5 运行时类型鉴别 183
6.5.1 RTTI概述 183
6.5.2 dynamic_cast 183
6.5.3 type_info类与typeid操作符 189
习题6 192
第7章 C 面向对象程序结构优化 199
7.1 面向对象程序设计的几个原则 199
7.1.1 引言 199
7.1.2 从可重用说起:合成/聚合优先原则 201
7.1.3 从可维护性说起:开闭原则 203
7.1.4 面向抽象原则 205
7.1.5 单一职责原则 211
7.1.6 接口分离原则 212
7.1.7 不要和陌生人说话 216
7.2 GoF设计模式举例:工厂模式 218
7.2.1 概述 218
7.2.2 简单工厂模式 219
7.2.3 工厂方法模式 221
习题7 223
第3篇 C 泛型程序设计
第8章 模板 227
8.1 算法抽象模板——函数模板 227
8.1.1 从函数重载到函数模板 227
8.1.2 函数模板的实例化与具体化 228
8.2 数据抽象模板——类模板 231
8.2.1 类模板的定义 231
8.2.2 类模板的实例化与具体化 232
8.2.3 类模板的使用 234
8.2.4 类模板实例化时的异常处理 235
8.2.5 实例:MyVector模板类的设计 236
习题8 240
第9章 STL编程 246
9.1 STL概述 246
9.1.1 容器 246
9.1.2 迭代器 248
9.1.3 容器的成员函数 251
9.1.4 STL算法 254
9.1.5 函数对象 257
9.1.6 STL标准头文件 260
9.2 线性顺序容器 260
9.2.1 vector 260
9.2.2 deque 262
9.2.3 array(C 11) 265
9.2.4 valarray 269
9.3 线性链表容器 271
9.3.1 从链表构建说起 271
9.3.2 list 273
9.3.3 forward_list(C 11) 277
9.4 容器适配器 279
9.4.1 stack与queue 279
9.4.2 stack操作 280
9.4.3 queue操作 281
9.5 关联容器 282
9.5.1 关联容器及其类型 282
9.5.2 set和multiset操作 283
9.5.3 map与multimap操作 285
习题9 289
附录A 二维码知识链接目录 292
参考文献 293
|
內容試閱:
|
(一)
1979年,Bjarne Stroustrup(C 之父,后面简称BS)正在准备他的博士毕业论文,他有机会使用一种叫作Simula 的语言。Simula语言主要用于计算机仿真,其67版被公认是首款支持面向对象的语言。Bjarne Stroustrup发现面向对象的思想对于软件开发非常有用,但是Simula语言执行效率低,实用性不强,于是他决定自行开发一种面向对象的语言,这就是今日的C 。
1979年Bjarne Stroustrup在准备一个项目时,基于C语言开发出了一种程序设计语言,将其称为C 。1985年C 被市场化。1998年11月C 标准委员会推出了个ISO标准(俗称C 98),2003年推出ISO标准第2版(俗称C 03)。
C 03是C 98的修正版,其初衷是修正C 98的一些不足。但是由于C 脱胎于C,遵循C是C 子集的原则,同时Bjarne Stroustrup坚持要保持其“适合教学”,以及既支持面向过程又支持面向对象的多泛型特色,造就了其概念清晰、设计严密、功能强大、效率较高的优点,但也带来过于复杂(如指针)、标准库苍白的不足,被人称为有精英化倾向的语言。因此,它比较受教育界欢迎,而程序员觉得难用。不过,在通过C 03标准之前,人们还没有认识到这些问题,反而降低了效率,加剧了其缺陷的影响,Python等语言乘虚而入,使其在2004年遭受到次强力冲击。
2004年的滑铁卢之惨使C 的设计者和标准制定者开始清醒起来,将指导思想修订 如下。
(1)维持与C 98,可能的话还有C之间的兼容性与稳定性。
(2)尽可能通过标准程序库来引进新的特性,而不是扩展核心语言。
(3)能够促进编程技术的变更优先。
(4)改进 C 以帮助系统和程序库的设计,而不是引进只对特定应用有用的新特性。
(5)增强类型安全,给现行不安全的技术提供更安全的替代方案。
(6)增强直接与硬件协同工作的性能和能力。
(7)为现实世界中的问题提供适当的解决方案。
(8)实行零负担原则(如果某些功能要求额外支持,那么只有在该功能被用到时这些额外的支持才被用到)。
(9)使C 易于教学。
简单地说,上述这些思想可以归结为:技术优先、安全高效、自由方便。这带给了程序员一个全新的面貌,以至于连C 之父都说它像一种新语言。2011年8月C 11成功了,它使C 摆脱了连续十年在TIOBE曲线上的步步下降的局面。
如图1所示,C 11已经公布近10年,新的C 14、C 17、C 20也已经公布。每一次更新,它都会汲取其他程序设计语言中的一些优势机制,并创造出其他程序设计语言所不具备的一些精彩华章,把程序设计技术带入一个新的高度。因此,学习C 与学习其他程序设计语言的不同之处在于,用它不仅可以开发出难度很高的软件,更重要的是它可以给计算机专业的人员许多启迪。
图1 近期C 标准修订步伐
不过,世界万物都有惯性。要C 教学与开发用户一下子全部改到C 标准上,很多人还是难以接受的,并且我自己也还在学习消化之中。在本书中,仅仅给出了C 11的部分新特点的接口,先让大家了解一下这些性能。在适当的时候,再做较全面和深入的介绍。
(二)
先撇开C 11、C 14、C 17和C 20的新特性,就从把C 当作C用的教学模式还广泛存在这一点看,我们的C 教学确定应当改进了。
Bjarne Stroustrup曾经感慨地说:“我不是使用支持工具进行巧妙设计的信徒,但是我强烈支持系统地使用数据抽象、面向对象编程和类属编程。不拥有支持库和模板,不进行事先的总体设计,而是埋头写下一页页的代码,这是在浪费时间,这是在给维护增加困难。”他还认为,“一个人对C 了解得越深,在写C 程序时就越难避免C 的风格,并会因此丢掉C 的某些潜在优势。”为此,他提出了以下几个相关的要点。在这些情况下做同样的事情时,在C 里存在比C中更好的处理方式。
(1)在C 里几乎不需要用宏。用const或enum 定义显式常量,用inline避免函数调用的额外开销,用template去刻画一族函数或者类型,用namespace 去避免名字冲突。
(2)不用在需要变量之前去声明它,以保证立即对其进行初始化。声明可以出现在能出现语句的所有位置上,可以出现在for语句的初始化部分,也可以出现在条件中。
(3)不用malloc(),new 运算符也能将同样的事情做得更好。对于realloc(),请试一试vector()。
(4)试着去避免void*、指针算术、联合和强制,除了在某些函数或类实现的深层之 外。在大部分情况下,强制都是设计错误的指示器。如果必须使用某个显式的类型转换,设法去用一个“新的强制”,设法写出一个描述你想做的事情的更精确的语句。
(5)尽量少用数组和C风格的字符串。与传统的C风格相比,使用C 标准库string和vector常常可以简化程序设计。如果要符合C的连接规则,一个C 函数就必须被声明为具有C连接的。
重要的是,要将程序考虑为一组由类和对象表示的相互作用的概念,而不是一堆数据结构和一些去拨弄数据结构中二进制位的函数。
探索如何彰显C 特色,也是本书改编的重要动因。
(三)
本次修改,将全书划分为3篇。
第1篇:C 命令式编程。用4章内容帮助初学者建立面向对象的问题分析思维,掌握相关方法和相关知识,树立面向对象程序设计中“一切皆对象,一切来自类”的意识。
第2篇:C 面向对象编程。用3章内容帮助读者理解如何在一个程序中组织类以及什么样的类结构才是好的程序结构。
第3篇:C 泛型程序设计。用2章内容介绍模板和STL。C 的泛型以及通用、灵活的特点给读者的学习带来了一定乐趣,也为读者将来从事程序开发工作提供了更多便捷方法。
此外,本书每章都围绕一个主题展开,其目的是引申基本内容,或为以后的学习做铺垫。
这样的结构体系安排,是考虑了以下几个因素和写作思想的结果。
(1)Bjarne Stroustrup的建议。
(2)重要先学,特色优先。
(3)思维开路,语法补充。
(4)多层次教学需要。
需要说明一点:本书给出的许多示例,虽然有用,但主要用于说明一种语法概念或给出一种编程思路,还不是精益求精的实用程序。
(四)
由J.?Piaget、O.?Kernberg、R.?J.?Sternberg、D.?Katz、Vogotsgy等人创建的建构主义(constructivism)学习理论认为,知识不是通过教师传授得到的,而是学习者在一定的情境即社会文化背景下借助其他人(包括教师和学习伙伴)的帮助,利用必要的学习资料,通过意义建构的方式而获得的。在信息时代,人们获得知识的途径发生了根本性的变化,教师不再是单一的“传道、授业、解惑”者,帮助学习者构建一个良好的学习环境也成为其一项重要职责。当然,这也是现代教材的责任。本书充分考虑了这些问题。
为了给读者创造一个良好的学习环境,本书采用二维码链接的形式给出了一些“知识链接”,其目的在于扩展读者的视野,帮助读者了解C 某些机制的来龙去脉,也为精力充沛、不够消化者“加餐”。
此外,在相关章后面安排了概念辨析、代码分析、开发实践和探索验证4种自测和训练实践环节,从而建立起一个全面的学习环境。
(1)概念辨析主要提供选择和判断两类自测题目,帮助学习者理解本单元学习过的有关概念,把当前学习内容所反映的事物尽量和自己已经知道的事物联系,并认真思考这种联系,通过“自我协商”与“相互协商”,形成新知识的同化与顺应。
(2)代码分析。代码阅读是程序设计者所应掌握的基本能力之一。代码分析部分的主要题型是通过阅读程序找出错误或给出程序执行结果。
(3)开发实践。提高程序开发能力是本书的主要目标。本书在绝大多数单元后面都给出了相应的作业题目。但是,完成这些题目并非只是简单地写出其代码,而要将其看作一个“思维 语法 方法”的工程训练。因此,要求每道题的作业都要以文档的形式提交。文档中应包括以下内容。
① 问题分析与建模。
② 源代码设计。
③ 测试用例设计。
④ 程序运行结果分析。
⑤ 编程心得(包括运行中出现的问题与解决方法、对于测试用例的分析、对于运行结果的分析等)。
⑥ 文档的排版也要遵照统一的格式。
(4)探索验证。建构主义提倡,学习者要用探索法和发现法去建构知识的意义。学习者要在意义建构的过程中主动地搜集和分析有关的信息资料,对碰到的问题提出各种假设,并努力加以验证。按照这一理论,本书还提供了一个探索验证栏目,以培养学习者获取知识的能力和不断探索的兴趣。
(五)
本人从事程序设计教学近40年。这40年,是在不断探索中走过来的。从20世纪80年代末,本人就开始探索程序设计课程从语法体系到问题驱动的改革;到了20世纪90年代中期又在此基础上考虑让学生在学习程序设计的同时掌握程序测试技能;2003年开始考虑如何改变学习了C 而设计出的程序却是面向过程的状况。每个阶段的探索,都反映在自己不同时期的相关作品中。本书则是自我认识又一次深化的表达。
经过这40年的探索,我越来越感觉到编写教材的责任和困难。要编写一本好的教材,不仅需要对本课程涉及内容有深刻的了解,还要熟悉相关领域的知识,特别是要不断探讨贯穿其中的教学理念和教育思想。所以,越到后来,就越感到自己知识和能力的不足。可是,作为一项历史性任务的研究,我又不愿意将之半途而废,只能硬着头皮写下去。每一次任务的完成,都得益于一些热心者的支持和帮助。在本书的写作过程中,陶利民参加了部分写作工作。此外,张秋菊、史林娟、张有明、张展赫、戴璐等也参加了部分编写工作,以及有关材料收集、程序调试和文字校对工作。在此谨表谢意。同时,一如既往地希望得到读者的广泛批评和建议,以便将这本书改得更好。
本书就要出版了。它的出版,是我在这项教学改革工作中跨上的一个新的台阶。本人衷心希望得到有关专家和读者的批评和建议,也希望能多结交一些志同道合者,把这项教学改革推向更新的境界。
张基温
2021年3月于锡城蠡溪
|
|