新概念C++程序设计大学教程(第3版)

副标题:无

作   者:张基温

分类号:

ISBN:9787302481546

微信扫一扫,移动浏览光盘

简介


本书是一本面向大学计算机专业的C 程序设计教材,以面向对象程序设计为主线,突出C 的基本特点,介绍C 1y的重要新特性。全书共分为4篇11个单元。第1篇:C 面向对象起步。用4个单元帮助初学者建立面向对象的问题分析思维,掌握相关方法和语法知识,树立面向对象程序中“一切皆对象,一切来自类”的意识,初步领略面向对象程序设计的奥妙。第2篇:C 面向抽象程序设计。用两个单元介绍C 的继承机制,并帮助读者理解如何在一个程序中组织类,以及什么样的类结构才是好的程序结构。第3篇:C 泛型程序设计。用两个单元介绍多态性和STL。C 的泛型的通用、灵活的特点将给读者的学习带来一定乐趣,也为读者将来从事程序开发工作提供了更多便捷方法。第4篇:C 深入编程。用3个单元介绍C 实体访问、函数和I/O流等方面的细节和内容,进一步丰富程序设计语言机制,使读者在程序开发上能够锦上添花。本书理念先进、概念清晰、讲解透彻、便于理解。书中例题经典、习题丰富、覆盖面广,适合作为高等学校各专业的面向对象程序设计教材。本书还可供培训机构使用,也可供相关领域人员自学。
【目录】

目录

第1篇 C 面向对象起步

第1单元 职员类 3

1.1 从具体对象到职员类 3

1.1.1具体职员对象的分析与描述 3

1.1.2Employee类的声明 4

1.1.3C 保留字、标识符与名字空间 5

1.2C 基本数据类型 7

1.2.1C 算术数据类型的表示格式 7

1.2.2C 算术数据类型的取值范围 9

1.2.3C 运算符与算术数据类型的操作集合 10

1.3 表达式 11

1.3.1字面值 11

1.3.2数据实体 11

1.3.3含有操作符的表达式 13

1.3.4表达式中的隐式数据类型转换 14

1.4 函数 15

1.4.1函数的关键环节 15

1.4.2标准输出流cout与printEmployee() 函数 17

1.4.3构造函数与析构函数 18

1.4.4构造函数重载 21

1.4.5复制构造函数 22

1.4.6主函数 24

1.5 程序编译 26

1.5.1编译预处理 26

1.5.2编译和连接 28

1.5.3多文件程序的编译 28

1.6 知识链接 30

1.6.1C 字面值 30

1.6.2const符号常量 33

1.6.3指针=基类型 地址 34

1.6.4指向对象的指针与this 36

1.6.5引用 38

习题1 39

第2单元 简单计算器 44

2.1 简单计算器建模 44

2.1.1简单计算器分析 44

2.1.2Calculator类的声明 44

2.2calculate( )函数的实现 45

2.2.1布尔类型与关系运算符 45

2.2.2用if-else结构实现成员函数calculate( ) 46

2.2.3用switch结构实现calculate( ) 48

2.2.4if-else判断结构与switch判断结构比较 49

2.2.5Calculator类测试 49

2.3C 异常处理 52

2.3.1程序错误 52

2.3.2C 异常处理机制 54

2.3.3C 异常处理技术 55

2.3.4用类作为异常类型 58

2.3.5捕获任何异常 62

2.4 简单桌面计算器的改进 63

2.4.1使用浮点数计算的Calculator类 63

2.4.2标准输入流与键盘输入 64

2.4.3简单多项式计算的实现 67

2.4.4用重复结构实现任意多项式计算 72

2.5 知识链接 74

2.5.1条件表达式 74

2.5.2局部变量 74

2.5.3类属变量、实例变量与局部变量的比较 76

习题2 76

第3单元 素数产生器 81

3.1 问题描述与对象建模 81

3.1.1对象建模 81

3.1.2getPrimeSequence( )函数的基本思路 82

3.2 使用isPrime( )的PrimeGenerator类实现 82

3.2.1用for结构实现的getPrimeSequence( )函数 82

3.2.2用for结构实现的isPrime( )函数 84

3.2.3完整的PrimeGenerator类及其测试 84

3.3 不使用isPrime( )的PrimeGenerator类实现 85

3.3.1采用嵌套重复结构的getPrimeSequence( )函数 85

3.3.2重复结构中的continue语句和break语句 86

3.4 数组 87

3.4.1数组及其定义 87

3.4.2数组的初始化规则 89

3.4.3用数组存储素数序列 90

3.4.4sizeof操作符 91

3.4.5C 11中基于容器的for循环 91

3.4.6数组prime的声明 92

3.5string类型 94

3.6 知识链接 94

3.6.1C 操作符 94

3.6.2左值表达式与右值表达式 96

3.6.3具有副作用的表达式与序列点 97

3.6.4表达式类型的推断与获取:auto 与decltype 98

3.6.5类型转换构造函数与explicit关键字 101

3.6.6C 语句 105

习题3 105

第4单元 Time类 110

4.1Time类需求分析与操作符重载 110

4.1.1Time类需求分析 110

4.1.2关键字operator与操作符重载 111

4.1.3操作符 的重载 112

4.1.4增量操作符 的重载 113

4.1.5 用友元函数实现<<重载 116

4.1.6赋值操作符=的重载 117

4.1.7操作符重载的基本规则 118

4.1.8Time类的类型转换构造函数 120

4.2 浅复制与深复制 122

4.2.1数据复制及其问题 122

4.2.2复制构造函数再讨论 124

4.2.3深复制的赋值操作符重载 126

4.3 动态内存分配 127

4.3.1用new进行动态内存分配 127

4.3.2用delete释放动态存储空间 128

4.3.3对象的动态存储分配 129

4.3.4动态内存分配时的异常处理 131

4.4 对象数组 132

4.4.1对象数组的定义 132

4.4.2对象数组元素的访问 133

4.4.3数组存储空间的动态分配 134

4.5 知识链接 134

4.5.1友元 134

4.5.2const修饰类成员与对象 138

4.5.3enum类型 140

习题4 144

第2篇 C 面向抽象程序设计

第5单元 继承 153

5.1 单基继承 153

5.1.1公司人员的类层次结构模型 153

5.1.2C 继承关系的建立 153

5.1.3在派生类中重定义基类成员函数 157

5.1.4基于血缘关系的访问控制——protected 159

5.1.5类层次结构中构造函数和析构函数的执行顺序 160

5.2 类层次中的赋值兼容规则与里氏代换原则 163

5.2.1类层次中的类型赋值兼容规则 163

5.2.2里氏代换原则 164

5.2.3对象的向上转换和向下转换 164

5.3 多基继承 165

5.3.1C 多基继承格式 165

5.3.2计算机系统=软件 硬件问题的类结构 165

5.3.3多基继承的歧义性问题 167

5.3.4虚拟基类 169

5.4 用虚函数实现动态绑定 170

5.4.1画圆、三角形和矩形问题的类结构 170

5.4.2虚函数与动态绑定 171

5.4.3虚函数表与虚函数规则 173

5.4.4override和final 175

5.4.5纯虚函数与抽象类 177

5.5 运行时类型鉴别 179

5.5.1RTTI概述 179

5.5.2dynamic_cast 179

5.5.3type_info类与typeid操作符 185

习题5 188

第6单元 C 程序结构优化 195

6.1 面向对象程序设计的几个原则 195

6.1.1引言 195

6.1.2从可重用说起:合成/聚合优先原则 197

6.1.3从可维护性说起:开闭原则 199

6.1.4面向抽象原则 201

6.1.5单一职责原则 207

6.1.6接口分离原则 208

6.1.7不要和陌生人说话 212

6.2GoF设计模式举例:工厂模式 214

6.2.1概述 214

6.2.2简单工厂模式 215

6.2.3工厂方法模式 217

习题6 219

第3篇 C 泛型程序设计

第7单元 模板 223

7.1 算法抽象模板--函数模板 223

7.1.1从函数重载到函数模板 223

7.1.2函数模板的实例化与具体化 224

7.2 数据抽象模板--类模板 227

7.2.1类模板的定义 227

7.2.2类模板的实例化与具体化 228

7.2.3类模板的使用 230

7.2.4类模板实例化时的异常处理 231

7.2.5实例:MyVector模板类的设计 232

习题7 236

第8单元 STL编程 242

8.1STL概述 242

8.1.1容器 242

8.1.2迭代器 244

8.1.3容器的成员函数 247

8.1.4STL算法 250

8.1.5函数对象 253

8.1.6STL标准头文件 255

8.2 扑克游戏——vector容器应用实例 256

8.2.1vector容器的特点 256

8.2.2扑克游戏对象模型 256

8.2.3用vector容器对象poker存储54张扑克牌 257

8.2.4洗牌函数设计 260

8.2.5整牌函数设计 263

8.2.6发牌函数设计 264

8.2.7vector操作小结 267

8.3list容器及其应用实例 268

8.3.1构建list对象及其迭代器 268

8.3.2操作list对象 269

8.3.3基于list容器的约瑟夫斯问题求解 273

8.4string 276

8.4.1字符串对象的创建与特性描述 277

8.4.2字符串对象的输入/输出 277

8.4.3字符串的迭代器与字符操作 278

8.4.4两个字符串间的操作 282

8.5stack容器 284

8.5.1stack及其特点 284

8.5.2stack的操作 284

8.5.3应用举例:将一个十进制整数转换为K进制数 285

8.6 关联容器 287

8.6.1用结构体定义的pair类模板 287

8.6.2set和multiset容器 289

8.6.3map和multimap容器 293

8.7 知识链接 297

8.7.1const_iterator 297

8.7.2分配器 298

习题8 299

第4篇 C 深入编程

第9单元 C 实体访问探幽 305

9.1C 实体的基本访问属性 305

9.1.1变量的生命期与C 存储分配 305

9.1.2标识符的作用域与链接性 307

9.2C 变量的存储属性 309

9.2.1C 的extern关键字 309

9.2.2C 的static关键字 313

9.3C 名字空间域 320

9.3.1名字冲突与名字空间 320

9.3.2名字空间的使用 322

9.3.3无名名字空间和全局名字空间 324

9.4const指针与const引用 325

9.4.1const修饰指针 325

9.4.2const修饰引用 326

9.4.3顶层const与底层const 327

9.5C 11的左值引用与右值引用 329

9.5.1C 11的左值引用与右值引用的基本概念 329

9.5.2基于左值和右值概念的表达式分类 330

9.5.3C 引用的扩展及绑定规则 330

9.5.4C 11的引用折叠与模板参数推导 333

9.6 智能指针 334

9.6.1智能指针及其基本原理 334

9.6.2auto_ptr智能指针 335

9.6.3Boost库的智能指针 337

习题9 339

第10单元 C 函数探幽 345

10.1C 函数调用时的参数匹配规则 345

10.1.1C 函数调用时的参数匹配规则 345

10.1.2关于函数实参的计算顺序 346

10.1.3函数名重载 346

10.1.4形参带有默认值的函数 349

10.1.5参数数目可变的函数 350

10.2参数类型 351

10.2.1对象参数 351

10.2.2指针参数 353

10.2.3数组参数 354

10.2.4左值引用参数 356

10.2.5const保护函数参数 359

10.2.6完美转发 360

10.3函数返回 363

10.3.1函数返回的基本规则 363

10.3.2函数返回指针 363

10.3.3函数返回引用 364

10.3.4const保护函数返回值 367

10.4移动语义 369

10.4.1移动语义的提出 369

10.4.2移动构造函数与移动赋值操作符 369

10.4.3强制移动与std::move() 371

10.5Lambda表达式 372

10.5.1简单的Lambda表达式 372

10.5.2在方括号中加入函数对象参数 373

习题10 375

第11单元 C I/O流 379

11.1流与C 流类 379

11.1.1流与缓冲区 379

11.1.2C 流类库 380

11.1.3ios类声明 381

11.2标准流对象与标准I/O流操作 383

11.2.1C 标准流对象 383

11.2.2标准输入/输出流操作 383

11.3流的格式化 383

11.3.1ios类的格式化成员函数和格式化标志 384

11.3.2格式化操作符 384

11.4文件流 385

11.4.1文件流的概念及其分类 385

11.4.2文件操作过程 386

11.5流的错误状态及其处理 389

11.5.1流的出错状态 389

11.5.2测试与设置出错状态位的ios类成员函数 390

习题11 390

附录A C 保留字 392

A.1C 关键字 392

A.2C 替代标记 392

A.3C 库保留名称 393

A.4C 特定字 393

附录B C 运算符的优先级别和结合方向 394

附录C C 标准库与准标准库 396

C.1C 标准库头文件 396

C.1.1标准库中与语言支持功能相关的头文件 396

C.1.2支持流输入/输出的头文件 396

C.1.3与诊断功能相关的头文件 397

C.1.4定义工具函数的头文件 397

C.1.5支持字符串处理的头文件 397

C.1.6定义容器类的模板的头文件 397

C.1.7支持迭代器的头文件 398

C.1.8有关算法的头文件 398

C.1.9有关数值操作的头文件 398

C.1.10有关本地化的头文件 398

C.2C Boost库内容 398

C.2.1字符串和文本处理库 399

C.2.2容器库 399

C.2.3迭代器库 399

C.2.4算法库 400

C.2.5函数对象和高阶编程库 400

C.2.6泛型编程库 400

C.2.7模板元编程 400

C.2.8预处理元编程库 401

C.2.9并发编程库 401

C.2.10数学和数字库 401

C.2.11排错和测试库 401

C.2.12数据结构库 402

C.2.13图像处理库 402

C.2.14输入/输出库 402

C.2.15跨语言混合编程库 402

C.2.16内存管理库 402

C.2.17解析库 402

C.2.18编程接口库 402

C.2.19综合类库 403

C.2.20编译器问题的变通方案库 403

参考文献 404

·VII·


【免费在线读】
第3单元 素数产生器素数(prime number,prime)又称质数,是在大于1的整数中,除了1和它本身外,不再有别的约数的数。素数产生器的功能是输出一个自然数区间中的所有素数。3.1 问题描述与对象建模3.1.1 对象建模本例的意图是建立一个自然数区间,如图3.1所示的[11, 101]、[350, 5500]、[3, 1000]等区间内的素数序列(prime series)。把每一个正整数区间的素数序列作为一个对象,则对这个问题建模,就是考虑定义一个具有一般性的素数产生器——PrimeGenerator类。这个类的行为是产生一个素数序列的函数getPrimeSequence( )。这个类中不同对象的区别是每个对象的区间下限(lowerNaturalNumber)和区间上限(upperNaturalNumber)不同。于是,可以得到如图3.2所示的PrimeGenerator类初步模型及其声明代码。
图3.1 不同的求素数对象【代码3-1】 PrimeGenerator类初步模型声明。
class PrimeGenerator { int lowerNaturalNumber; int upperNaturalNumber;public: void getPrimeSequence ();}

3.1.2 getPrimeSequence( )函数的基本思路getPrimeSequence( )函数的功能是给出 [lowerNaturalNumber,upperNaturalNumber] 区间内的素数序列。基本思路是,从lowerNaturalNumber到upperNaturalNumber,逐一对每一个数进行测试,看其是否为素数。如果是,则输出该数(用不带回车的输出,以便显示出一个序列);否则,继续对下一个数进行测试。每次测试使用的代码相同,只是被测试的数据不同。也就是说,这样一个函数中的代码要不断重复执行,直到达到目的为止。这种程序结构称为重复结构,也称循环结构。在实现getPrimeSequence( )函数时有如下两种考虑。(1)用isPrime( )判定一个数是否为素数。为了将getPrimeSequence( )函数设计得比较简单,把测试一个数是否为素数的工作也用一个函数isPrime( )进行。所以getPrimeSequence( )函数就是重复地对区间内每个数用函数isPrime( )进行测试。isPrime( )函数用来对于某个自然数进行测试,看其是否为素数。其原型应当为:“bool isPrime(int number);”。测试一个自然数是否为素数的基本方法是:把这个数number依次用2~number/2去除,只要有一个能整除,该数就不是素数。所以,这两个函数都要采用重复结构。(2)在getPrimeSequence( )函数中直接判定一个数是否为素数。下面分别来讨论。3.2 使用isPrime( )的PrimeGenerator类实现C 有3种重复控制结构:while、do-while和for。无论哪种重复结构,都要包含如下用于控制重复过程的三部分内容:初始化部分、循环条件和修正部分。在2.4节中,已经讨论过while结构和do-while结构的用法。下面讨论用for结构实现getPrimeSequence( )和isPrime( )函数的方法。3.2.1 用for结构实现的getPrimeSequence( )函数如前所述,循环结构是通过初始化部分、循环条件和修正部分来控制循环过程的。while结构和do-while结构将这3个部分分别放在不同位置,而for结构则把这3个部分放在一起,形成如下形式:
for (初始化部分; 循环条件; 修正部分) { 循环体}
这样,可以对循环过程的控制一目了然,特别适合用于循环次数可以预先确定的情况。所以也把for循环称为计数循环。【代码3-2】 采用for结构的getPrimeSequence( )代码。
void PrimeGenerator::getPrimeSequence () { std::cout << lowerNaturalNumber << "到" << upperNaturalNumber << "之间的素数序列为:"; for(int m = lwerNaturalNumber; m <= upperNaturalNumber; m ) //循环控制 if (isPrime (m)) std::cout << m << ","; }
说明:(1)for结构也称计数型重复结构。当重复具有明显的计数特征时,采用for结构更为合适。(2)在C 中,表达式m = m 1可以简化为m = 1。“ =”称为“赋值加”,是加和赋值的组合操作符。如i = 5,相当于 i = i 5。除赋值加外,复合赋值操作符还有:“??=”“*=”“/=”等。复合赋值操作符的优先级别与赋值操作符相同。注意,任何由两个字符组成的操作符(如“= =”“>=”“<=”“!=”及复合赋值操作符等)作为一个整体,字符之间不能加空格。(3)m = m 1还有一种更简洁的表示形式: m或m ,“ ”称为增量操作符或自增操作符。与增量操作符“ ”对应的是减量操作符“???”,或称自减操作符。(4)这个重复(循环)结构的基本作用是对一个自然数区间中的每一个数都进行是否为素数的测试。这种思路称为穷举。在这个穷举过程中,每测试完一个自然数后,就通过i 这样的操作来找到下一个自然数。这种在一个值的基础上通过某种操作找后一个值的过程称为迭代。穷举和迭代是重复结构的两个基本用途,也是一切计算机算法的基础。

目录


目录

第1篇 C 面向对象起步

第1单元 职员类 3

1.1 从具体对象到职员类 3

1.1.1具体职员对象的分析与描述 3

1.1.2Employee类的声明 4

1.1.3C 保留字、标识符与名字空间 5

1.2C 基本数据类型 7

1.2.1C 算术数据类型的表示格式 7

1.2.2C 算术数据类型的取值范围 9

1.2.3C 运算符与算术数据类型的操作集合 10

1.3 表达式 11

1.3.1字面值 11

1.3.2数据实体 11

1.3.3含有操作符的表达式 13

1.3.4表达式中的隐式数据类型转换 14

1.4 函数 15

1.4.1函数的关键环节 15

1.4.2标准输出流cout与printEmployee() 函数 17

1.4.3构造函数与析构函数 18

1.4.4构造函数重载 21

1.4.5复制构造函数 22

1.4.6主函数 24

1.5 程序编译 26

1.5.1编译预处理 26

1.5.2编译和连接 28

1.5.3多文件程序的编译 28

1.6 知识链接 30

1.6.1C 字面值 30

1.6.2const符号常量 33

1.6.3指针=基类型 地址 34

1.6.4指向对象的指针与this 36

1.6.5引用 38

习题1 39

第2单元 简单计算器 44

2.1 简单计算器建模 44

2.1.1简单计算器分析 44

2.1.2Calculator类的声明 44

2.2calculate( )函数的实现 45

2.2.1布尔类型与关系运算符 45

2.2.2用if-else结构实现成员函数calculate( ) 46

2.2.3用switch结构实现calculate( ) 48

2.2.4if-else判断结构与switch判断结构比较 49

2.2.5Calculator类测试 49

2.3C 异常处理 52

2.3.1程序错误 52

2.3.2C 异常处理机制 54

2.3.3C 异常处理技术 55

2.3.4用类作为异常类型 58

2.3.5捕获任何异常 62

2.4 简单桌面计算器的改进 63

2.4.1使用浮点数计算的Calculator类 63

2.4.2标准输入流与键盘输入 64

2.4.3简单多项式计算的实现 67

2.4.4用重复结构实现任意多项式计算 72

2.5 知识链接 74

2.5.1条件表达式 74

2.5.2局部变量 74

2.5.3类属变量、实例变量与局部变量的比较 76

习题2 76

第3单元 素数产生器 81

3.1 问题描述与对象建模 81

3.1.1对象建模 81

3.1.2getPrimeSequence( )函数的基本思路 82

3.2 使用isPrime( )的PrimeGenerator类实现 82

3.2.1用for结构实现的getPrimeSequence( )函数 82

3.2.2用for结构实现的isPrime( )函数 84

3.2.3完整的PrimeGenerator类及其测试 84

3.3 不使用isPrime( )的PrimeGenerator类实现 85

3.3.1采用嵌套重复结构的getPrimeSequence( )函数 85

3.3.2重复结构中的continue语句和break语句 86

3.4 数组 87

3.4.1数组及其定义 87

3.4.2数组的初始化规则 89

3.4.3用数组存储素数序列 90

3.4.4sizeof操作符 91

3.4.5C 11中基于容器的for循环 91

3.4.6数组prime的声明 92

3.5string类型 94

3.6 知识链接 94

3.6.1C 操作符 94

3.6.2左值表达式与右值表达式 96

3.6.3具有副作用的表达式与序列点 97

3.6.4表达式类型的推断与获取:auto 与decltype 98

3.6.5类型转换构造函数与explicit关键字 101

3.6.6C 语句 105

习题3 105

第4单元 Time类 110

4.1Time类需求分析与操作符重载 110

4.1.1Time类需求分析 110

4.1.2关键字operator与操作符重载 111

4.1.3操作符 的重载 112

4.1.4增量操作符 的重载 113

4.1.5 用友元函数实现<<重载 116

4.1.6赋值操作符=的重载 117

4.1.7操作符重载的基本规则 118

4.1.8Time类的类型转换构造函数 120

4.2 浅复制与深复制 122

4.2.1数据复制及其问题 122

4.2.2复制构造函数再讨论 124

4.2.3深复制的赋值操作符重载 126

4.3 动态内存分配 127

4.3.1用new进行动态内存分配 127

4.3.2用delete释放动态存储空间 128

4.3.3对象的动态存储分配 129

4.3.4动态内存分配时的异常处理 131

4.4 对象数组 132

4.4.1对象数组的定义 132

4.4.2对象数组元素的访问 133

4.4.3数组存储空间的动态分配 134

4.5 知识链接 134

4.5.1友元 134

4.5.2const修饰类成员与对象 138

4.5.3enum类型 140

习题4 144

第2篇 C 面向抽象程序设计

第5单元 继承 153

5.1 单基继承 153

5.1.1公司人员的类层次结构模型 153

5.1.2C 继承关系的建立 153

5.1.3在派生类中重定义基类成员函数 157

5.1.4基于血缘关系的访问控制——protected 159

5.1.5类层次结构中构造函数和析构函数的执行顺序 160

5.2 类层次中的赋值兼容规则与里氏代换原则 163

5.2.1类层次中的类型赋值兼容规则 163

5.2.2里氏代换原则 164

5.2.3对象的向上转换和向下转换 164

5.3 多基继承 165

5.3.1C 多基继承格式 165

5.3.2计算机系统=软件 硬件问题的类结构 165

5.3.3多基继承的歧义性问题 167

5.3.4虚拟基类 169

5.4 用虚函数实现动态绑定 170

5.4.1画圆、三角形和矩形问题的类结构 170

5.4.2虚函数与动态绑定 171

5.4.3虚函数表与虚函数规则 173

5.4.4override和final 175

5.4.5纯虚函数与抽象类 177

5.5 运行时类型鉴别 179

5.5.1RTTI概述 179

5.5.2dynamic_cast 179

5.5.3type_info类与typeid操作符 185

习题5 188

第6单元 C 程序结构优化 195

6.1 面向对象程序设计的几个原则 195

6.1.1引言 195

6.1.2从可重用说起:合成/聚合优先原则 197

6.1.3从可维护性说起:开闭原则 199

6.1.4面向抽象原则 201

6.1.5单一职责原则 207

6.1.6接口分离原则 208

6.1.7不要和陌生人说话 212

6.2GoF设计模式举例:工厂模式 214

6.2.1概述 214

6.2.2简单工厂模式 215

6.2.3工厂方法模式 217

习题6 219

第3篇 C 泛型程序设计

第7单元 模板 223

7.1 算法抽象模板--函数模板 223

7.1.1从函数重载到函数模板 223

7.1.2函数模板的实例化与具体化 224

7.2 数据抽象模板--类模板 227

7.2.1类模板的定义 227

7.2.2类模板的实例化与具体化 228

7.2.3类模板的使用 230

7.2.4类模板实例化时的异常处理 231

7.2.5实例:MyVector模板类的设计 232

习题7 236

第8单元 STL编程 242

8.1STL概述 242

8.1.1容器 242

8.1.2迭代器 244

8.1.3容器的成员函数 247

8.1.4STL算法 250

8.1.5函数对象 253

8.1.6STL标准头文件 255

8.2 扑克游戏——vector容器应用实例 256

8.2.1vector容器的特点 256

8.2.2扑克游戏对象模型 256

8.2.3用vector容器对象poker存储54张扑克牌 257

8.2.4洗牌函数设计 260

8.2.5整牌函数设计 263

8.2.6发牌函数设计 264

8.2.7vector操作小结 267

8.3list容器及其应用实例 268

8.3.1构建list对象及其迭代器 268

8.3.2操作list对象 269

8.3.3基于list容器的约瑟夫斯问题求解 273

8.4string 276

8.4.1字符串对象的创建与特性描述 277

8.4.2字符串对象的输入/输出 277

8.4.3字符串的迭代器与字符操作 278

8.4.4两个字符串间的操作 282

8.5stack容器 284

8.5.1stack及其特点 284

8.5.2stack的操作 284

8.5.3应用举例:将一个十进制整数转换为K进制数 285

8.6 关联容器 287

8.6.1用结构体定义的pair类模板 287

8.6.2set和multiset容器 289

8.6.3map和multimap容器 293

8.7 知识链接 297

8.7.1const_iterator 297

8.7.2分配器 298

习题8 299

第4篇 C 深入编程

第9单元 C 实体访问探幽 305

9.1C 实体的基本访问属性 305

9.1.1变量的生命期与C 存储分配 305

9.1.2标识符的作用域与链接性 307

9.2C 变量的存储属性 309

9.2.1C 的extern关键字 309

9.2.2C 的static关键字 313

9.3C 名字空间域 320

9.3.1名字冲突与名字空间 320

9.3.2名字空间的使用 322

9.3.3无名名字空间和全局名字空间 324

9.4const指针与const引用 325

9.4.1const修饰指针 325

9.4.2const修饰引用 326

9.4.3顶层const与底层const 327

9.5C 11的左值引用与右值引用 329

9.5.1C 11的左值引用与右值引用的基本概念 329

9.5.2基于左值和右值概念的表达式分类 330

9.5.3C 引用的扩展及绑定规则 330

9.5.4C 11的引用折叠与模板参数推导 333

9.6 智能指针 334

9.6.1智能指针及其基本原理 334

9.6.2auto_ptr智能指针 335

9.6.3Boost库的智能指针 337

习题9 339

第10单元 C 函数探幽 345

10.1C 函数调用时的参数匹配规则 345

10.1.1C 函数调用时的参数匹配规则 345

10.1.2关于函数实参的计算顺序 346

10.1.3函数名重载 346

10.1.4形参带有默认值的函数 349

10.1.5参数数目可变的函数 350

10.2参数类型 351

10.2.1对象参数 351

10.2.2指针参数 353

10.2.3数组参数 354

10.2.4左值引用参数 356

10.2.5const保护函数参数 359

10.2.6完美转发 360

10.3函数返回 363

10.3.1函数返回的基本规则 363

10.3.2函数返回指针 363

10.3.3函数返回引用 364

10.3.4const保护函数返回值 367

10.4移动语义 369

10.4.1移动语义的提出 369

10.4.2移动构造函数与移动赋值操作符 369

10.4.3强制移动与std::move() 371

10.5Lambda表达式 372

10.5.1简单的Lambda表达式 372

10.5.2在方括号中加入函数对象参数 373

习题10 375

第11单元 C I/O流 379

11.1流与C 流类 379

11.1.1流与缓冲区 379

11.1.2C 流类库 380

11.1.3ios类声明 381

11.2标准流对象与标准I/O流操作 383

11.2.1C 标准流对象 383

11.2.2标准输入/输出流操作 383

11.3流的格式化 383

11.3.1ios类的格式化成员函数和格式化标志 384

11.3.2格式化操作符 384

11.4文件流 385

11.4.1文件流的概念及其分类 385

11.4.2文件操作过程 386

11.5流的错误状态及其处理 389

11.5.1流的出错状态 389

11.5.2测试与设置出错状态位的ios类成员函数 390

习题11 390

附录A C 保留字 392

A.1C 关键字 392

A.2C 替代标记 392

A.3C 库保留名称 393

A.4C 特定字 393

附录B C 运算符的优先级别和结合方向 394

附录C C 标准库与准标准库 396

C.1C 标准库头文件 396

C.1.1标准库中与语言支持功能相关的头文件 396

C.1.2支持流输入/输出的头文件 396

C.1.3与诊断功能相关的头文件 397

C.1.4定义工具函数的头文件 397

C.1.5支持字符串处理的头文件 397

C.1.6定义容器类的模板的头文件 397

C.1.7支持迭代器的头文件 398

C.1.8有关算法的头文件 398

C.1.9有关数值操作的头文件 398

C.1.10有关本地化的头文件 398

C.2C Boost库内容 398

C.2.1字符串和文本处理库 399

C.2.2容器库 399

C.2.3迭代器库 399

C.2.4算法库 400

C.2.5函数对象和高阶编程库 400

C.2.6泛型编程库 400

C.2.7模板元编程 400

C.2.8预处理元编程库 401

C.2.9并发编程库 401

C.2.10数学和数字库 401

C.2.11排错和测试库 401

C.2.12数据结构库 402

C.2.13图像处理库 402

C.2.14输入/输出库 402

C.2.15跨语言混合编程库 402

C.2.16内存管理库 402

C.2.17解析库 402

C.2.18编程接口库 402

C.2.19综合类库 403

C.2.20编译器问题的变通方案库 403

参考文献 404

·VII·


【免费在线读】
第3单元 素数产生器素数(prime number,prime)又称质数,是在大于1的整数中,除了1和它本身外,不再有别的约数的数。素数产生器的功能是输出一个自然数区间中的所有素数。3.1 问题描述与对象建模3.1.1 对象建模本例的意图是建立一个自然数区间,如图3.1所示的[11, 101]、[350, 5500]、[3, 1000]等区间内的素数序列(prime series)。把每一个正整数区间的素数序列作为一个对象,则对这个问题建模,就是考虑定义一个具有一般性的素数产生器——PrimeGenerator类。这个类的行为是产生一个素数序列的函数getPrimeSequence( )。这个类中不同对象的区别是每个对象的区间下限(lowerNaturalNumber)和区间上限(upperNaturalNumber)不同。于是,可以得到如图3.2所示的PrimeGenerator类初步模型及其声明代码。
图3.1 不同的求素数对象【代码3-1】 PrimeGenerator类初步模型声明。
class PrimeGenerator { int lowerNaturalNumber; int upperNaturalNumber;public: void getPrimeSequence ();}

3.1.2 getPrimeSequence( )函数的基本思路getPrimeSequence( )函数的功能是给出 [lowerNaturalNumber,upperNaturalNumber] 区间内的素数序列。基本思路是,从lowerNaturalNumber到upperNaturalNumber,逐一对每一个数进行测试,看其是否为素数。如果是,则输出该数(用不带回车的输出,以便显示出一个序列);否则,继续对下一个数进行测试。每次测试使用的代码相同,只是被测试的数据不同。也就是说,这样一个函数中的代码要不断重复执行,直到达到目的为止。这种程序结构称为重复结构,也称循环结构。在实现getPrimeSequence( )函数时有如下两种考虑。(1)用isPrime( )判定一个数是否为素数。为了将getPrimeSequence( )函数设计得比较简单,把测试一个数是否为素数的工作也用一个函数isPrime( )进行。所以getPrimeSequence( )函数就是重复地对区间内每个数用函数isPrime( )进行测试。isPrime( )函数用来对于某个自然数进行测试,看其是否为素数。其原型应当为:“bool isPrime(int number);”。测试一个自然数是否为素数的基本方法是:把这个数number依次用2~number/2去除,只要有一个能整除,该数就不是素数。所以,这两个函数都要采用重复结构。(2)在getPrimeSequence( )函数中直接判定一个数是否为素数。下面分别来讨论。3.2 使用isPrime( )的PrimeGenerator类实现C 有3种重复控制结构:while、do-while和for。无论哪种重复结构,都要包含如下用于控制重复过程的三部分内容:初始化部分、循环条件和修正部分。在2.4节中,已经讨论过while结构和do-while结构的用法。下面讨论用for结构实现getPrimeSequence( )和isPrime( )函数的方法。3.2.1 用for结构实现的getPrimeSequence( )函数如前所述,循环结构是通过初始化部分、循环条件和修正部分来控制循环过程的。while结构和do-while结构将这3个部分分别放在不同位置,而for结构则把这3个部分放在一起,形成如下形式:
for (初始化部分; 循环条件; 修正部分) { 循环体}
这样,可以对循环过程的控制一目了然,特别适合用于循环次数可以预先确定的情况。所以也把for循环称为计数循环。【代码3-2】 采用for结构的getPrimeSequence( )代码。
void PrimeGenerator::getPrimeSequence () { std::cout << lowerNaturalNumber << "到" << upperNaturalNumber << "之间的素数序列为:"; for(int m = lwerNaturalNumber; m <= upperNaturalNumber; m ) //循环控制 if (isPrime (m)) std::cout << m << ","; }
说明:(1)for结构也称计数型重复结构。当重复具有明显的计数特征时,采用for结构更为合适。(2)在C 中,表达式m = m 1可以简化为m = 1。“ =”称为“赋值加”,是加和赋值的组合操作符。如i = 5,相当于 i = i 5。除赋值加外,复合赋值操作符还有:“??=”“*=”“/=”等。复合赋值操作符的优先级别与赋值操作符相同。注意,任何由两个字符组成的操作符(如“= =”“>=”“<=”“!=”及复合赋值操作符等)作为一个整体,字符之间不能加空格。(3)m = m 1还有一种更简洁的表示形式: m或m ,“ ”称为增量操作符或自增操作符。与增量操作符“ ”对应的是减量操作符“???”,或称自减操作符。(4)这个重复(循环)结构的基本作用是对一个自然数区间中的每一个数都进行是否为素数的测试。这种思路称为穷举。在这个穷举过程中,每测试完一个自然数后,就通过i 这样的操作来找到下一个自然数。这种在一个值的基础上通过某种操作找后一个值的过程称为迭代。穷举和迭代是重复结构的两个基本用途,也是一切计算机算法的基础。
【作者简介】
张基温 研究和教学领域涉及计算机科学与技术、信息管理、信息经济学、电子政务与电子商务、服务科学,发表论文百余篇,出版著作百余种;先后担任名古屋大学访问学者,山西财经大学、江南大学、华东政法大学、华南农业大学珠江学院、常熟理工学院、福建工程学院、广西职业技术学院、晋城学院等多所大学的专职、客座或兼职教授,北京大学博雅方略城市发展与信息化研究中心研究员,南京大学出版社总编顾问,太原高新技术区IT研究院实验室主任,山西省紧缺人才专家委员会副主任等职,中国信息经济学会常务理事,全国高等院校计算机基础教育研究会常务理事兼课程建设委员会副主任,中国计算机学会教育专业委员会委员,NIT考试委员会委员,江苏省计算机基础教学指导委员会委员,山西省新世纪专家学者协会副会长;为清华大学出版社、电子工业出版社、中国水利水电出版社、南京大学出版社等出版社主编了信息管理与信息系统专业、计算机实验与实践、大学生信息素养等多个系列教材,已经发表论文百余篇,出版著作百余种。在程序设计教学领域,从20世纪80年代初就开始进行有关研究和改革,尝试将软件工程方法和算法思想引入程序设计,倡导“从语法体系向问题体系转变”、“程序设计 = 思维训练 语言艺术 工程规范”,率先把设计模式及其有关原则引入到面向对象的程序设计教材中。

已确认勘误

次印刷

页码 勘误内容 提交人 修订印次

新概念C++程序设计大学教程(第3版)
    • 名称
    • 类型
    • 大小

    光盘服务联系方式: 020-38250260    客服QQ:4006604884

    意见反馈

    14:15

    关闭

    云图客服:

    尊敬的用户,您好!您有任何提议或者建议都可以在此提出来,我们会谦虚地接受任何意见。

    或者您是想咨询:

    用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问

    Video Player
    ×
    Audio Player
    ×
    pdf Player
    ×
    Current View

    看过该图书的还喜欢

    some pictures

    解忧杂货店

    东野圭吾 (作者), 李盈春 (译者)

    loading icon