《C++大学教程 第3版》PDF下载

  • 购买积分:14 如何计算积分?
  • 作  者:(美)Eric Nagler著;侯普秀,曹振新译
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2005
  • ISBN:7302098492
  • 页数:432 页
图书介绍:本书通过大量示例主要介绍了命名空间、I/O基础、引用变量和动态内存分配、类、函数、模板继承、I/O内容。

第1章 由C迁移到C++ 1

1.1 概述 1

1.2 C与C++的比较 1

1.3 编译器如何识别C++程序 1

目录 1

1.4 预处理器如何识别环境 2

1.5 新的注释风格 2

1.6 永远不要假定(隐式地使用int类型) 3

1.7 main()的默认返回值 3

1.8 声明与定义的区别 4

1.9 函数声明中的形参名称 4

1.10 函数定义中的形参名称 4

1.13 函数参数的默认值 5

1.11 所有的函数在调用前必须先声明 5

1.12 空圆括号的含义 5

1.14 初始化与赋值的区别 6

1.15 放置变量声明的地方 7

1.16 for循环内的变量声明 8

1.17 标记名成为类型名 8

1.18 C++与C中枚举类型的区别 9

1.19 初始化全局变量 10

1.20 数组初始化 11

1.21 布尔类型 11

1.22 void*指针 12

1.24.1 所有的常量必须初始化 13

1.23 使用O,而不是宏NULL 13

1.24 关键字const 13

1.24.2 将常量值的参数传递给函数的含义 14

1.24.3 函数返回值为常量的含义 14

1.24.4 const如何影响指针 14

1.24.5 C++与C中字符数组的区别 15

1.24.6 如何支持char const*类型的数组 16

1.24.7 C以及C++处理const方式的区别 16

1.24.8 使用const而不#define 17

1.24.9 const变量的连接 18

1.25 新的类型强制转换风格 18

1.25.1 类型强制转换以及转换的区别 18

1.25.3 static cast 19

1.25.2 类型强制转换的一般格式 19

1.25.4 reinterpret cast 20

1.25.5 const cast 20

1.25.6 您不会犯错 21

1.26 C 以及C++关键字 21

第2章 命名空间 23

2.1 概述 23

2.2 存在的问题 23

2.3 如何创建命名空间 24

2.4 作用域分解运算符 25

2.5 如何访问命名空间的成员 25

2.5.1 直接访问命名空间的成员 25

2.5.2 using声明——访问命名空间成员的另一种方法 26

2.5.3 using指令——访问命名空间成员的另一种方法 27

2.6 小心避免不明确的情况 28

2.7 无名的命名空间 28

2.8 命名空间的别名 29

2.9 Koenig查找规则 30

第3章 输入/输出基础 32

3.1 概述 32

3.2 使用新函数的理由 32

3.3 头文件——命名约定 33

3.4 iostream头文件 33

3.5 cout对象 33

3.5.2 显式地限定cout对象 34

3.5.1 插入运算符 34

3.5.3 使用using声明来访问cout对象 35

3.5.4 使用using指令来访问cout对象 35

3.6 关于正确使用std命名空间的建议 36

3.7 了解运算符的优先级 37

3.8 输出格式 37

3.9 cin对象 37

3.10 检查文件是否结束 39

第4章 引用变量 42

4.1 概述 42

4.2 存在的问题 42

4.4 所有的引用都必须初始化 44

4.5 引用的作用 44

4.3 如何创建引用变量 44

4.6 使用const限定引用 45

4.7 何时不需要使用引用 46

4.8 没有“常量引用” 47

4.9 创建对指针的引用 47

4.10 创建对数组的引用 48

4.11 由函数返回引用 49

第5章 动态内存分配 51

5.1 概述 51

5.2 如何为单个对象分配动态内存 51

5.3 如何初始化基本类型 52

5.4 空圆括号的含义 52

5.6 如何为对象的数组分配空闲空间 53

5.5 如何释放单个对象的空闲空间 53

5.7 如何释放对象数组的空闲空间 54

5.8 保持平衡 55

59 如何使用new和delete在空闲存储区中存储字符串 55

5.10 如何分配和删除多维数组 57

5.11 命名该空间 58

5.12 两个程序输出示例 58

第6章 类 61

6.1 概述 61

6.2 C中的结构 61

6.2.1 全局函数 62

6.2.2 C存在的问题 62

6.3.1 修订后的Circle抽象 63

6.3 初识封装 63

6.3.2 必须支持常量对象 64

6.4 结构与类 64

6.5 类的用途 65

6.6 类的组件 65

6.7 如何编写类定义 65

6.7.1 类声明与类定义 66

6.7.2 关于输入/输出类 69

6.8 数据隐藏的原则 69

6.9 访问限定符 71

6.9.1 private关键字 72

6.9.4 选择编码风格 73

6.9.3 protected关键字 73

6.9.2 public关键字 73

6.10 模块化并实现隐藏 74

6.10.1 如何模块化 75

6.10.2 用户的任务 77

6.10.3 本节小结 77

6.11 如何通过实例来访问类成员 77

6.12 内联函数 79

6.12.1 内联函数的含义 80

6.12.2 内联函数与宏的对比 80

6.12.3 使得内联函数对编译器有效 80

6.12.5 内联函数的连接 81

6.12.6 如何编写全局成员内联函数 81

6.12.4 放置内联函数的地方 81

6.12.7 如何编写类成员内联函数 82

6.12.8 隐式内联和显式内联的比较 84

6.13 mutable关键字 84

6.14 如何显示类的内容 85

6.15 类中的枚举类型 87

6.15.1 使用枚举的原因 88

6.1 5.2 私有枚举 88

6.1 5.3 公有枚举 90

6.15.4 “Enum Hack”的作用 91

7.1 概述 94

7.2 构造函数的定义 94

第7章 构造函数和析构函数 94

7.2.1 语法规则 95

7.2.2 何时不调用构造函数 95

7.2.3 编译器提供的默认构造函数 96

7.2.4 默认的构造函数:普遍定义 97

7.2.5 初始化常量对象 98

7.2.6 构造函数重载 98

7.2.7 不能直接调用构造函数 100

7.3 析构函数的定义 101

7.3.1 编译器提供的析构函数 101

7.3.2 析构函数的作用 101

7.3.3 编写您自己的析构函数 102

7.3.4 语法规则 102

7.5 如何实例化类并向构造函数传递参数 103

7.4 如何实例化类并调用默认构造函数 103

7.6 如何阻止使用默认构造函数的实例化 104

7.7 隐式类型转换 106

7.8 复制构造函数 109

7.8.1 默认复制构造函数 110

7.8.2 复制构造函数的语法 111

7.8.3 复制构造函数的数量 111

7.8.4 浅复制与深复制 111

7.8.5 编写您自己的复制构造函数 112

7.8.6 如何阻止对象复制 114

7.9 函数风格的强制转换 115

7.11 基/成员初始化列表 118

7.10 初始化与赋值 118

7.11.1 默认初始化 120

7.11.2 强制使用基/成员初始化列表 120

7.11.3 另一种初始化调用的情况 121

7.12 关于指针 123

7.13 形参名与类成员名 123

7.14 非静态数据成员的初始化顺序 123

7.15 基本类型的数组作为非静态数据成员 125

7.16 用户自定义类型数组作为非静态数据成员 125

7.17 如何创建用户自定义实例的数组 126

7.18 如何声明常量数据成员数组 128

7.19 如何在空闲存储区中创建用户自定义类型 128

7.21 调用new时的语法 129

7.20 如何在空闲存储区中创建用户自定义类型的数组 129

第8章 类的其他特征 134

8.1 概述 134

8.2 this指针 134

8.2.1 解引用this指针来复制调用对象 136

8.2.2 解引用this指针以允许链接函数 137

8.3 静态类数据成员 139

8.3.1 在类的定义中初始化静态类数据成员 142

8.3.2 静态成员函数 143

8.3.3 用于生成随机数的类 145

8.3.4 Die类 145

8.3.5 Dice类 147

8.4 类的大小 151

8.5 友元函数 152

8.5.1 类如何授权一个函数作为它的友元函数 152

8.5.2 成员函数和非成员函数 153

8.5.3 使用非成员非友元函数替代友元函数 155

8.5.4 在命名空间中声明类的友元函数 156

8.6 友元类 158

8.7 类的封装 162

8.8 运算符转换函数 169

8.8.1 用途 169

8.8.2 语法 170

8.9 类成员指针 171

8.9.1 全局函数指针 171

8.9.3 使用指向非静态成员函数的指针调用函数 172

8.9.2 指向非静态类成员函数的指针 172

8.9.4 指向静态类成员函数的指针 173

第9章 异常处理 174

9.1 概述 174

9.2 如何抛出异常 174

9.3 如何捕获异常 174

9.4 catch代码块的匹配处理 176

9.5 异常处理的一个简单示例 176

9.6 释放堆栈 177

9.7 如果调用new失败怎么办 177

9.8 如何防止new抛出异常 178

9.9 异常的传播 179

9.10 如何处理指向空闲空间的指针 181

9.11 不能销毁还没有创建的对象 184

9.12 重新抛出对象 184

9.13 从子对象成员中捕获抛出的异常 184

9.14 function-try-blocks 185

9.15 子对象成员和指针的混合使用 187

9.16 对象的局部结构 189

9.17 编写异常-安全代码 190

9.17.1 堆栈中的简单对象 190

9.17.2 堆栈中的对象数组 191

9.17.3 空闲存储区中的简单对象 191

9.17.4 再论空闲存储区中的简单对象 192

9.17.5 空闲存储区中的对象数组 193

9.17.6 再论空闲存储区中的对象数组 195

9.18 析构函数和异常处理 196

9.19 异常规范 196

9.20 出错条件 197

9.20.1 意外错误 198

9.20.2 终止错误 198

9.21 编译器如何对待异常规范 198

9.22 为类定义operator new()函数 199

第10章 函数重载 203

10.1 概述 203

10.2 几个关于函数重载的示例 203

10.5 const限定参数按指针传递 204

10.3 忽略返回类型 204

10.4 const限定参数按值传递 204

10.6 const限定参数按引用传递 205

10.7 可变成员函数和常量成员函数 205

10.8 重载决议 206

10.9 根据指针类型重载 207

10.10 名称重整 207

10.10.1 如何避免名称重整 208

10.10.2 类型-安全连接 209

10.11 运算符函数重载 210

10.11.1 运算符优先级表 211

10.11.3 默认参数 213

10.11.4 C++自带的运算符 213

10.11.2 重载运算符的命名 213

10.11.5 不能改变优先级 214

10.11.6 不能改变“Narity” 214

10.11.7 不能改变结合性 214

10.11.8 成员函数与非成员函数 214

10.11.9 至少支持一个类实例 215

10.11.10 中缀表示法和函数表示法 215

10.11.11 二元成员函数和隐式类型转换 216

10.11.12 多次重载或者允许隐式类型转换 218

10.11.13 运算符的重载 219

10.11.14 赋值运算符 220

10.11.15 函数调用运算符 223

10.11.16 下标运算符 225

10.11.17 间接成员运算符 226

10.11.18 复合赋值运算符 229

10.11.19 目增运算符和自减运算符 231

10.11.20 重载逗号运算符 233

10.11.21 重载逻辑与和逻辑或运算符 233

10.11.22 重载插入运算符 234

10.11.23 运算符小结 235

第11章 继承 238

11.1 概述 238

11.2 内存中的派生类实例 238

11.3 使用继承创建is-a关系 238

11.4 如何定义派生类 239

11.6 关键字protected 240

11.5 再论结构和类 240

11.7 访问特权 241

11.8 基类“存取器”函数 242

11.9 修改继承访问 243

11.10 函数隐藏 245

11.11 派生类成员函数如何调用基类成员函数 248

11.12 管理函数 249

11.12.1 如何编写管理函数 250

11.12.2 派生类到基类的标准转换 254

11.12.3 隐藏非成员函数 255

11.12.4 不要对数组进行向上类型转换 257

11.13 多态性 257

11.14 多态性和虚函数 262

11.14.1 友好的程序代码和不友好的程序代码 263

11.14.2 重写虚函数 263

11.14.3 虚析构函数 265

11.14.4 从基类的构造函数中调用虚函数 266

11.15 抽象基类 266

11.15.1 再论关于贷款的示例 267

11.15.2 关于虚函数的异常规范 267

11.16 里氏代换原则 268

11.17 多重继承 270

11.17.1 虚基类 273

11.17.2 初始化虚基类 274

12.1 概述 278

12.2 函数模板 278

第12章 模板 278

12.2.1 不使用宏的原因 279

12.2.2 如何编写函数模板 280

12.2.3 优化代码 281

12.2.4 在何处使用函数模板 282

12.2.5 针对不同的参数类型进行实例化 283

12.2.6 显式地指定类型 284

12.2.7 默认的函数参数 285

12.2.8 完全特殊化函数模板 286

12.2.9 如何调用特殊化的函数 288

12.2.10 对特殊化和重载的选择 291

12.2.11 特殊化greater()函数模板 294

12.3 类模板 297

12.3.1 如何定义类模板 297

12.3.2 在类定义之外定义成员 298

12.3.3 实例化类模板 299

12.3.4 另一个模板的模板实例化 299

12.3.5 默认模板参数 300

12.3.6 在类模板中声明另一个友元类 301

12.3.7 在类模板中声明友元函数 301

12.3.8 特殊化类模板 307

12.3.9 在类模板中嵌入类模板 313

12.3.10 从类模板中派生新类 315

12.4 非类型模板参数 317

12.4.1 默认的模板参数和特殊化 318

12.4.2 关于使用非类型模板参数的有趣示例 320

12.5 成员模板 322

12.6 模板模式 326

12.7 关键字typename 329

第13章 运行时类型信息 332

13.1 概述 332

13.2 动态转型态 332

13.3 动态转型态是如何工作的 333

13.4 关键字typeid 335

14.2 实例std::cerr和std::clog 341

14.3 如何格式化输出 341

14.1 概述 341

第14章 输出流 341

14.3.1 位格式标志 342

14.3.2 如何打开位格式标志 343

14.3.3 如何以合适的基数显示整数 345

14.3.4 如何显示整数的基数设置 347

14.3.5 如何显示整数的符号 347

14.3.6 如何将输出显示为大写字母 348

14.3.7 如何显示字符 349

1413.8 如何设置输出字段宽度 350

14.3.9 如何指定填充字符 351

14.3.10 如何指定字段对齐 352

14.3.11 如何格式化浮点型数值 353

14.4 如何显示bool类型 357

14.5 如何显示地址 358

14.6 如何输出到内存缓冲区 359

14.6.1 成员函数ostream::flush() 360

14.6.2 预定义的stdio和iostream流的混合使用 360

第15章 输入流 362

15.1 概述 362

15.2 如何检查错误 362

15.2.1 错误报告标志 362

15.2.2 访问成员函数 363

15.2.3 直接测试iostream对象 364

15.2.4 成员函数std::basic_ios::clear() 366

15.2.5 如何清空输入流的缓冲区 368

15.3 字符输入 370

15.3.2 限制输入字符的个数 372

15.3.1 使用提取运算符实现对字符串的输入 372

15.3.3 使用std::istream::getline()实现字符串输入 374

第16章 操纵符 376

16.1 概述 376

16.2 操纵符的格式 376

16.3 一些简单的操纵符 377

16.4 不带参数调用的内置操纵符 380

16.5 使用带有一个参数的操纵符 381

16.6 使用带有一个参数的内置操纵符 383

第17章 文件输入/输出 385

17.1 概述 385

17.2 文件输入/输出类 385

17.3.1 文件名参数 386

17.3 文件输出 386

17.3.3 验证文件是否打开 387

17.3.4 关闭打开的文件 387

17.3.2 文件模式参数 387

17.3.5 输出磁盘文件示例 388

17.4 文件输入 389

17.5 文件位置标记 390

17.6 文件更新 391

17.7 二进制模式 392

17.8 未格式化的输出 394

17.9 未格式化的输入 396

17.10 重定向I/O 397

18.2 string类 400

第18章 string类与标准模板库 400

18.1 概述 400

18.3 标准模板库 404

18.3.1 std::vector类 404

18.3.2 迭代器 407

18.3.3 迭代器的类型 408

18.3.4 基于string的I/O 414

18.3.5 标准模板库中的算法 417

18.3.6 标准模板库的主要容器 423

18.3.7 比较对象 423

附录A 参考书目 429

附录B C++准则 431