《C++程序设计原理与实践》PDF下载

  • 购买积分:18 如何计算积分?
  • 作  者:(美)斯特劳斯特鲁普著
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2010
  • ISBN:9787111303220
  • 页数:649 页
图书介绍:本书一方面介绍了通用的程序设计方法(包括面向对象程序设计和泛型程序设计),另一方面还对软件开发实践中使用最广泛的程序设计语言——C++进行了很好的介绍。本书从开篇就开始介绍现代C++程序设计技术,并介绍了大量关于如何使用C++标准库来简化程序设计的内容。

第0章 致读者 1

0.1 本书结构 1

0.1.1 一般方法 2

0.1.2 简单练习、习题等 2

0.1.3 进阶学习 3

0.2 讲授和学习本书的方法 4

0.2.1 本书内容顺序的安排 6

0.2.2 程序设计和程序设计语言 7

0.2.3 可移植性 7

0.3 程序设计和计算机科学 8

0.4 创造性和问题求解 8

0.5 反馈方法 8

0.6 参考文献 8

0.7 作者简介 9

第1章 计算机、人与程序设计 11

1.1 介绍 11

1.2 软件 11

1.3 人 13

1.4 计算机科学 15

1.5 计算机已无处不在 15

1.5.1 有屏幕和没有屏幕 16

1.5.2 船舶 16

1.5.3 电信 17

1.5.4 医疗 18

1.5.5 信息领域 19

1.5.6 一种垂直的视角 20

1.5.7 与C++程序设计有何联系 21

1.6 程序员的理想 21

第一部分 基本知识 25

第2章 Hello,World! 25

2.1 程序 25

2.2 经典的第一个程序 26

2.3 编译 27

2.4 链接 29

2.5 编程环境 30

第3章 对象、类型和值 34

3.1 输入 34

3.2 变量 35

3.3 输入和类型 36

3.4 运算和运算符 37

3.5 赋值和初始化 39

3.5.1 实例:删除重复单词 41

3.6 组合赋值运算符 42

3.6.1 实例:重复单词统计 42

3.7 命名 43

3.8 类型和对象 44

3.9 类型安全 45

3.9.1 安全类型转换 46

3.9.2 不安全类型转换 46

第4章 计算 51

4.1 计算 51

4.2 目标和工具 52

4.3 表达式 53

4.3.1 常量表达式 54

4.3.2 运算符 55

4.3.3 类型转换 56

4.4 语句 56

4.4.1 选择语句 57

4.4.2 循环语句 61

4.5 函数 64

4.5.1 使用函数的原因 65

4.5.2 函数声明 66

4.6 向量 67

4.6.1 向量空间增长 67

4.6.2 一个数值计算的例子 68

4.6.3 一个文本处理的例子 70

4.7 语言特性 71

第5章 错误 75

5.1 介绍 75

5.2 错误的来源 76

5.3 编译时错误 77

5.3.1 语法错误 77

5.3.2 类型错误 77

5.3.3 警告 78

5.4 连接时错误 78

5.5 运行时错误 79

5.5.1 调用者处理错误 80

5.5.2 被调用者处理错误 81

5.5.3 报告错误 82

5.6 异常 83

5.6.1 错误参数 83

5.6.2 范围错误 84

5.6.3 输入错误 85

5.6.4 截断错误 87

5.7 逻辑错误 88

5.8 估计 89

5.9 调试 90

5.9.1 实用调试技术 91

5.10 前置条件和后置条件 94

5.10.1 后置条件 95

5.11 测试 96

第6章 编写一个程序 100

6.1 一个问题 100

6.2 对问题的思考 100

6.2.1 程序设计的几个阶段 101

6.2.2 策略 101

6.3 回到计算器问题 102

6.3.1 第一步尝试 103

6.3.2 单词 104

6.3.3 实现单词 106

6.3.4 使用单词 107

6.3.5 重新开始 108

6.4 文法 109

6.4.1 英文文法 112

6.4.2 设计一个文法 113

6.5 将文法转换为程序 114

6.5.1 实现文法规则 114

6.5.2 表达式 115

6.5.3 项 117

6.5.4 基本表达式 118

6.6 试验第一个版本 119

6.7 试验第二个版本 122

6.8 单词流 123

6.8.1 实现Token_stream 124

6.8.2 读单词 125

6.8.3 读数值 126

6.9 程序结构 127

第7章 完成一个程序 131

7.1 介绍 131

7.2 输入和输出 131

7.3 错误处理 133

7.4 处理负数 135

7.5 模运算:% 136

7.6 清理代码 138

7.6.1 符号常量 138

7.6.2 使用函数 139

7.6.3 代码格式 140

7.6.4 注释 141

7.7 错误恢复 143

7.8 变量 145

7.8.1 变量和定义 145

7.8.2 引入单词name 148

7.8.3 预定义名字 150

7.8.4 我们到达目的地了吗 150

第8章 函数相关的技术细节 153

8.1 技术细节 153

8.2 声明和定义 154

8.2.1 声明的类别 156

8.2.2 变量和常量声明 157

8.2.3 默认初始化 158

8.3 头文件 158

8.4 作用域 160

8.5 函数调用和返回 163

8.5.1 声明参数和返回类型 163

8.5.2 返回一个值 164

8.5.3 传值参数 165

8.5.4 传常量引用参数 166

8.5.5 传引用参数 168

8.5.6 传值与传引用的对比 169

8.5.7 参数检查和转换 171

8.5.8 实现函数调用 172

8.6 求值顺序 175

8.6.1 表达式求值 176

8.6.2 全局初始化 176

8.7 名字空间 177

8.7.1 using声明和using指令 178

第9章 类相关的技术细节 183

9.1 用户自定义类型 183

9.2 类和成员 184

9.3 接口和实现 184

9.4 演化一个类 185

9.4.1 结构和函数 185

9.4.2 成员函数和构造函数 187

9.4.3 保持细节私有性 188

9.4.4 定义成员函数 189

9.4.5 引用当前对象 191

9.4.6 报告错误 191

9.5 枚举类型 192

9.6 运算符重载 193

9.7 类接口 195

9.7.1 参数类型 195

9.7.2 拷贝 197

9.7.3 默认构造函数 197

9.7.4 const成员函数 199

9.7.5 类成员和“辅助函数” 200

9.8 Date类 201

第二部分 输入和输出 207

第10章 输入/输出流 207

10.1 输入和输出 207

10.2 I/O流模型 208

10.3 文件 209

10.4 打开文件 210

10.5 读写文件 211

10.6 I/O错误处理 213

10.7 读取单个值 215

10.7.1 将程序分解为易管理的子模块 216

10.7.2 将人机对话从函数中分离 218

10.8 用户自定义输出操作符 219

10.9 用户自定义输入操作符 220

10.10 一个标准的输入循环 220

10.11 读取结构化的文件 222

10.11.1 内存表示 222

10.11.2 读取结构化的值 224

10.11.3 改变表示方法 226

第11章 定制输入/输出 230

11.1 有规律的和无规律的输入和输出 230

11.2 格式化输出 230

11.2.1 输出整数 231

11.2.2 输入整数 232

11.2.3 输出浮点数 232

11.2.4 精度 233

11.2.5 域 234

11.3 文件打开和定位 235

11.3.1 文件打开模式 235

11.3.2 二进制文件 236

11.3.3 在文件中定位 238

11.4 字符串流 238

11.5 面向行的输入 239

11.6 字符分类 240

11.7 使用非标准分隔符 241

11.8 还有很多未讨论的内容 246

第12章 一个显示模型 249

12.1 为什么要使用图形用户界面 249

12.2 一个显示模型 250

12.3 第一个例子 250

12.4 使用GUI库 252

12.5 坐标系 253

12.6 形状 253

12.7 使用形状类 254

12.7.1 图形头文件和主函数 254

12.7.2 一个几乎空白的窗口 255

12.7.3 坐标轴 256

12.7.4 绘制函数图 257

12.7.5 Polygon 257

12.7.6 Rectangle 258

12.7.7 填充 259

12.7.8 文本 259

12.7.9 图片 259

12.7.10 还有很多未讨论的内容 260

12.8 让图形程序运行起来 261

12.8.1 源文件 261

第13章 图形类 264

13.1 图形类概览 264

13.2 Point和Line 265

13.3 Lines 267

13.4 Color 268

13.5 Line_style 270

13.6 Open_polyline 271

13.7 Closed_polyline 271

13.8 Polygon 272

13.9 Rectangle 273

13.10 管理未命名对象 276

13.11 Text 277

13.12 Circle 278

13.13 Ellipse 279

13.14 Marked_polyline 280

13.15 Marks 281

13.16 Mark 282

13.17 Image 283

第14章 设计图形类 288

14.1 设计原则 288

14.1.1 类型 288

14.1.2 操作 289

14.1.3 命名 290

14.1.4 可变性 291

14.2 Shape类 291

14.2.1 一个抽象类 292

14.2.2 访问控制 293

14.2.3 绘制形状 295

14.2.4 拷贝和可变性 297

14.3 基类和派生类 298

14.3.1 对象布局 299

14.3.2 类的派生和虚函数定义 300

14.3.3 覆盖 301

14.3.4 访问 302

14.3.5 纯虚函数 302

14.4 面向对象程序设计的好处 303

第15章 绘制函数图和数据图 307

15.1 介绍 307

15.2 绘制简单函数图 307

15.3 Function类 309

15.3.1 默认参数 310

15.3.2 更多的例子 311

15.4 Axis类 311

15.5 近似 313

15.6 绘制数据图 316

15.6.1 读取文件 317

15.6.2 一般布局 318

15.6.3 数据比例 319

15.6.4 构造数据图 319

第16章 图形用户界面 324

16.1 用户界面的选择 324

16.2 “Next”按钮 325

16.3 一个简单的窗口 325

16.3.1 回调函数 327

16.3.2 等待循环 328

16.4 Button和其他Widget 329

16.4.1 Widget 329

16.4.2 Button 330

16.4.3 In_box和Out_box 330

16.4.4 Menu 331

16.5 一个实例 332

16.6 控制流的反转 334

16.7 添加菜单 335

16.8 调试GUI代码 338

第三部分 数据结构和算法 343

第17章 向量和自由空间 343

17.1 介绍 343

17.2 向量的基本知识 344

17.3 内存、地址和指针 345

17.3.1 运算符sizeof 347

17.4 自由空间和指针 347

17.4.1 自由空间分配 348

17.4.2 通过指针访问数据 349

17.4.3 指针范围 349

17.4.4 初始化 350

17.4.5 空指针 351

17.4.6 自由空间释放 351

17.5 析构函数 353

17.5.1 生成的析构函数 354

17.5.2 析构函数和自由空间 355

17.6 访问向量元素 356

17.7 指向类对象的指针 356

17.8 类型混用:无类型指针和指针类型转换 357

17.9 指针和引用 359

17.9.1 指针参数和引用参数 359

17.9.2 指针、引用和继承 360

17.9.3 实例:列表 360

17.9.4 列表的操作 362

17.9.5 列表的使用 363

17.10 this指针 364

17.10.1 关于Link使用的更多讨论 365

第18章 向量和数组 369

18.1 介绍 369

18.2 拷贝 369

18.2.1 拷贝构造函数 370

18.2.2 拷贝赋值 372

18.2.3 拷贝术语 373

18.3 必要的操作 374

18.3.1 显示构造函数 375

18.3.2 调试构造函数与析构函数 376

18.4 访问向量元素 377

18.4.1 对const对象重载运算符 378

18.5 数组 379

18.5.1 指向数组元素的指针 380

18.5.2 指针和数组 381

18.5.3 数组初始化 383

18.5.4 指针问题 383

18.6 实例:回文 385

18.6.1 使用string实现回文 386

18.6.2 使用数组实现回文 386

18.6.3 使用指针实现回文 387

第19章 向量、模板和异常 391

19.1 问题 391

19.2 改变向量大小 393

19.2.1 方法描述 393

19.2.2 reserve和capacity 394

19.2.3 resize 394

19.2.4 push_back 395

19.2.5 赋值 395

19.2.6 到现在为止我们设计的vector类 397

19.3 模板 397

19.3.1 类型作为模板参数 398

19.3.2 泛型编程 399

19.3.3 容器和继承 401

19.3.4 整数作为模板参数 402

19.3.5 模板参数推导 403

19.3.6 一般化vector类 403

19.4 范围检查和异常 405

19.4.1 附加讨论:设计上的考虑 406

19.4.2 使用宏 407

19.5 资源和异常 408

19.5.1 潜在的资源管理问题 409

19.5.2 资源获取即初始化 410

19.5.3 保证 411

19.5.4 auto_ptr 412

19.5.5 vector类的RAII 412

第20章 容器和迭代器 417

20.1 存储和处理数据 417

20.1.1 处理数据 417

20.1.2 一般化代码 418

20.2 STL建议 420

20.3 序列和迭代器 423

20.3.1 回到实例 424

20.4 链表 425

20.4.1 列表操作 426

20.4.2 迭代 427

20.5 再次一般化vector 428

20.6 实例:一个简单的文本编辑器 429

20.6.1 处理行 431

20.6.2 迭代 431

20.7 vector、list和string 434

20.7.1 insert和erase 435

20.8 调整vector类达到STL版本的功能 436

20.9 调整内置数组达到STL版本的功能 438

20.10 容器概览 439

20.10.1 迭代器类别 440

第21章 算法和映射 444

21.1 标准库中的算法 444

21.2 最简单的算法:find 444

21.2.1 一些一般的应用 446

21.3 通用搜索算法:find_if() 447

21.4 函数对象 448

21.4.1 函数对象的抽象视图 449

21.4.2 类成员上的谓词 450

21.5 数值算法 450

21.5.1 累积 451

21.5.2 一般化accumulate() 452

21.5.3 内积 453

21.5.4 一般化inner_product() 453

21.6 关联容器 454

21.6.1 映射 454

21.6.2 map概览 456

21.6.3 另一个map实例 458

21.6.4 unordered_map 459

21.6.5 集合 461

21.7 拷贝操作 462

21.7.1 拷贝 462

21.7.2 流迭代器 462

21.7.3 使用集合保持顺序 464

21.7.4 copy_if 464

21.8 排序和搜索 465

第四部分 拓宽视野 471

第22章 理念和历史 471

22.1 历史、理念和专业水平 471

22.1.1 程序设计语言的目标和哲学 471

22.1.2 编程理念 473

22.1.3 风格/范型 477

22.2 程序设计语言历史概览 479

22.2.1 最早的程序语言 480

22.2.2 现代程序设计语言的起源 481

22.2.3 Algol家族 485

22.2.4 Simula 490

22.2.5 C 491

22.2.6 C++ 493

22.2.7 今天的程序设计语言 495

22.2.8 参考资源 496

第23章 文本处理 499

23.1 文本 499

23.2 字符串 499

23.3 I/O流 502

23.4 映射 503

23.4.1 实现细节 507

23.5 一个问题 508

23.6 正则表达式的思想 510

23.7 用正则表达式进行搜索 511

23.8 正则表达式语法 513

23.8.1 字符和特殊字符 514

23.8.2 字符集 514

23.8.3 重复 515

23.8.4 子模式 516

23.8.5 可选项 516

23.8.6 字符集和范围 516

23.8.7 正则表达式错误 518

23.9 与正则表达式进行模式匹配 519

23.10 参考文献 522

第24章 数值计算 525

24.1 介绍 525

24.2 大小、精度和溢出 525

24.2.1 数值限制 527

24.3 数组 528

24.4 C风格的多维数组 528

24.5 Matrix库 529

24.5.1 矩阵的维和矩阵访问 530

24.5.2 一维矩阵 532

24.5.3 二维矩阵 534

24.5.4 矩阵I/O 536

24.5.5 三维矩阵 536

24.6 实例:求解线性方程组 537

24.6.1 经典的高斯消去法 538

24.6.2 选取主元 539

24.6.3 测试 539

24.7 随机数 540

24.8 标准数学函数 541

24.9 复数 542

24.10 参考文献 543

第25章 嵌入式系统程序设计 547

25.1 嵌入式系统 547

25.2 基本概念 549

25.2.1 可预测性 551

25.2.2 理想 551

25.2.3 生活在故障中 552

25.3 内存管理 553

25.3.1 动态内存分配存在的问题 554

25.3.2 动态内存分配的替代方法 556

25.3.3 存储池实例 557

25.3.4 栈实例 557

25.4 地址、指针和数组 558

25.4.1 未经检查的类型转换 559

25.4.2 一个问题:不正常的接口 559

25.4.3 解决方案:接口类 561

25.4.4 继承和容器 564

25.5 位、字节和字 566

25.5.1 位和位运算 566

25.5.2 bitset 569

25.5.3 有符号数和无符号数 570

25.5.4 位运算 573

25.5.5 位域 574

25.5.6 实例:简单加密 575

25.6 编码规范 579

25.6.1 编码规范应该是怎样的 579

25.6.2 编码原则实例 580

25.6.3 实际编码规范 584

第26章 测试 589

26.1 我们想要什么 589

26.1.1 说明 590

26.2 程序正确性证明 590

26.3 测试 590

26.3.1 回归测试 591

26.3.2 单元测试 591

26.3.3 算法和非算法 596

26.3.4 系统测试 601

26.3.5 测试类 604

26.3.6 寻找不成立的假设 606

26.4 测试方案设计 607

26.5 调试 607

26.6 性能 607

26.6.1 计时 609

26.7 参考文献 610

第27章 C语言 613

27.1 C和C++:兄弟 613

27.1.1 C/C++兼容性 614

27.1.2 C不支持的C++特性 615

27.1.3 C标准库 616

27.2 函数 617

27.2.1 不支持函数名重载 617

27.2.2 函数参数类型检查 618

27.2.3 函数定义 619

27.2.4 C++调用C和C调用C++ 620

27.2.5 函数指针 621

27.3 小的语言差异 622

27.3.1 结构标签名字空间 622

27.3.2 关键字 623

27.3.3 定义 623

27.3.4 C风格类型转换 624

27.3.5 void*的转换 625

27.3.6 枚举 626

27.3.7 名字空间 626

27.4 动态内存分配 626

27.5 C风格字符串 628

27.5.1 C风格字符串和const 629

27.5.2 字节操作 630

27.5.3 实例:strcpy() 630

27.5.4 一个风格问题 630

27.6 输入/输出:stdio 631

27.6.1 输出 631

27.6.2 输入 632

27.6.3 文件 633

27.7 常量和宏 633

27.8 宏 634

27.8.1 类函数宏 635

27.8.2 语法宏 636

27.8.3 条件编译 636

27.9 实例:侵入式容器 637

术语表 644

参考书目 648