《21天学通C++ 原书第7版》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:(美)罗奥著;袁国忠译
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2012
  • ISBN:9787115296245
  • 页数:458 页
图书介绍:本书是当今市场上最受欢迎的C++学习教程,在讲解C++基本知识(如变量、数组、循环、线程)和高级主题(如面向对象编程、宏和模板的类和对象)的同时,还涵盖了最新的C++标准模板库(STL)等在内的知识。

第1章 绪论 1

1.1 C++简史 1

1.1.1与C语言的关系 1

1.1.2 C++的优点 1

1.1.3 C++标准的发展历程 1

1.1.4哪些人使用C++程序 2

1.2编写C++应用程序 2

1.2.1生成可执行文件的步骤 2

1.2.2分析并修复错误 2

1.2.3集成开发环境 2

1.2.4编写第一个C++应用程序 3

1.2.5生成并执行第一个C++应用程序 4

1.2.6理解编译错误 4

1.3 C++11新增的功能 5

1.4总结 5

1.5问与答 5

1.6作业 6

1.6.1 测验 6

1.6.2练习 6

第2章C+程序的组成部分 7

2.1 Hello World程序的组成部分 7

2.1.1预处理器编译指令#include 7

2.1.2程序的主体——main() 8

2.1.3返回值 8

2.2名称空间的概念 9

2.3 C++代码中的注释 10

2.4 C++函数 10

2.5使用std::cin和std::cout执行基本输入输出操作 12

2.6总结 13

2.7问与答 13

2.8作业 13

2.8.1测验 14

2.8.2练习 14

第3章 使用变量和常量 15

3.1什么是变量 15

3.1.1内存和寻址概述 15

3.1.2声明变量以访问和使用内存 15

3.1.3声明并初始化多个类型相同的变量 17

3.1.4理解变量的作用域 17

3.1.5全局变量 18

3.2编译器支持的常见C++变量类型 19

3.2.1使用bool变量存储布尔值 20

3.2.2使用char变量存储字符 20

3.2.3有符号整数和无符号整数的概念 20

3.2.4有符号整型short、 int、 long和long long 21

3.2.5无符号整型unsigned short、unsigned int、 unsigned long和unsigned long long 21

3.2.6浮点类型float和double 21

3.3使用sizeof确定变量的长度 22

3.4使用typedef替换变量类型 24

3.5什么是常量 24

3.5.1字面常量 25

3.5.2使用const将变量声明为常量 25

3.5.3使用constexpr声明常量 26

3.5.4枚举常量 26

3.5.5使用#define定义常量 27

3.6给变量和常量命名 28

3.7不能用作常量或变量名的关键字 28

3.8总结 29

3.9问与答 29

3.10作业 30

3.10.1测验 30

3.10.2练习 30

第4章 管理数组和字符串 31

4.1什么是数组 31

4.1.1为何需要数组 31

4.1.2声明和初始化静态数组 32

4.1.3数组中的数据是如何存储的 32

4.1.4访问存储在数组中的数据 33

4.1.5修改存储在数组中的数据 34

4.2多维数组 35

4.2.1声明和初始化多维数组 36

4.2.2访问多维数组中的元素 36

4.3动态数组 37

4.4 C风格字符串 38

4.5 C++字符串:使用std::string 40

4.6总结 41

4.7问与答 41

4.8作业 42

4.8.1测验 42

4.8.2练习 42

第5章 使用表达式、语句和运算符 43

5.1语句 43

5.2复合语句(语句块) 44

5.3使用运算符 44

5.3.1赋值运算符(=) 44

5.3.2理解左值和右值 44

5.3.3加法运算符(+)、减法运算符(-)、乘法运算符(*)、除法运算符(/)和求模运算符(%) 44

5.3.4递增运算符(+++)和递减运算符(--) 45

5.3.5前缀还是后缀 45

5.3.6相等运算符(==)和不等运算符(!=) 47

5.3.7关系运算符 48

5.3.8逻辑运算NOT、AND、OR和XOR 49

5.3.9使用C++逻辑运算NOT(!)、AND(&&)和OR(||) 50

5.3.10按位运算符NOT(~)、AND(&)、OR(|)和XOR(∧) 53

5.3.11按位右移运算符(>>)和左移运算符(<<) 54

5.3.12复合赋值运算符 55

5.3.13使用运算符sizeof确定变量占用的内存量 56

5.3.14运算符优先级 57

5.4总结 58

5.5问与答 59

5.6作业 59

5.6.1测验 59

5.6.2练习 59

第6章 控制程序流程 60

6.1使用if…else有条件地执行 60

6.1.1使用if…else进行条件编程 61

6.1.2有条件地执行多条语句 62

6.1.3嵌套if语句 63

6.1.4使用switchcase进行条件处理 66

6.1.5使用运算符?:进行条件处理 68

6.2在循环中执行代码 69

6.2.1不成熟的goto循环 69

6.2.2 while循环 70

6.2.3 do…while循环 72

6.2.4 for循环 73

6.3使用continue和break修改循环的行为 75

6.3.1不结束的循环——无限循环 75

6.3.2控制无限循环 76

6.4编写嵌套循环 78

6.4.1使用嵌套循环遍历多维数组 79

6.4.2使用嵌套循环计算斐波纳契数列 80

6.5总结 81

6.6问与答 81

6.7作业 82

6.7.1测验 82

6.7.2练习 82

第7章 使用函数组织代码 83

7.1为何需要函数 83

7.1.1函数原型是什么 84

7.1.2函数定义是什么 85

7.1.3函数调用和实参是什么 85

7.1.4编写接受多个参数的函数 85

7.1.5编写没有参数和返回值的函数 86

7.1.6带默认值的函数参数 87

7.1.7递归函数——调用自己的函数 88

7.1.8包含多条return语句的函数 89

7.2使用函数处理不同类型的数据 90

7.2.1函数重载 90

7.2.2将数组传递给函数 92

7.2.3按引用传递参数 93

7.3微处理器如何处理函数调用 94

7.3.1内联函数 94

7.3.2 lambda函数 96

7.4总结 97

7.5问与答 97

7.6作业 97

7.6.1测验 97

7.6.2练习 98

第8章 阐述指针和引用 99

8.1什么是指针 99

8.1.1声明指针 99

8.1.2使用引用运算符(&)获取变量的地址 100

8.1.3使用指针存储地址 101

8.1.4使用解除引用运算符(*)访问指向的数据 102

8.1.5将sizeof()用于指针的结果 104

8.2动态内存分配 105

8.2.1使用new和delete动态地分配和释放内存 105

8.2.2将递增和递减运算符(+++和--)用于指针的结果 107

8.2.3将关键字const用于指针 109

8.2.4将指针传递给函数 109

8.2.5数组和指针的类似之处 110

8.3使用指针时常犯的编程错误 112

8.3.1内存泄露 112

8.3.2指针指向无效的内存单元 112

8.3.3悬浮指针(也叫迷途或失控指针) 113

8.4指针编程最佳实践 114

8.4.1检查使用new发出的分配请求是否得到满足 115

8.5引用是什么 117

8.5.1是什么让引用很有用 117

8.5.2将关键字const用于引用 118

8.5.3按引用向函数传递参数 119

8.6总结 119

8.7问与答 120

8.8作业 121

8.8.1测验 121

8.8.2练习 121

第9章 类和对象 122

9.1类和对象 122

9.1.1声明类 123

9.1.2实例化对象 123

9.1.3使用句点运算符访问成员 123

9.1.4使用指针运算符(-﹥)访问成员 124

9.2关键字public和private 125

9.2.1使用关键字private实现数据抽象 126

9.3构造函数 127

9.3.1声明和实现构造函数 128

9.3.2何时及如何使用构造函数 128

9.3.3重载构造函数 130

9.3.4没有默认构造函数的类 131

9.3.5带默认值的构造函数参数 133

9.3.6包含初始化列表的构造函数 133

9.4析构函数 135

9.4.1声明和实现析构函数 135

9.4.2何时及如何使用析构函数 135

9.5复制构造函数 137

9.5.1浅复制及其存在的问题 137

9.5.2使用复制构造函数确保深复制 139

9.5.3有助于改善性能的移动构造函数 142

9.6构造函数和析构函数的其他用途 143

9.6.1不允许复制的类 143

9.6.2只能有一个实例的单例类 144

9.6.3禁止在栈中实例化的类 146

9.7 this指针 147

9.8将sizeof()用于类 148

9.9结构不同于类的地方 150

9.10声明友元 150

9.11总结 152

9.12问与答 152

9.13作业 153

9.13.1测验 153

9.13.2练习 153

第10章 实现继承 154

10.1继承基础 154

10.1.1继承和派生 154

10.1.2 C++派生语法 155

10.1.3访问限定符protected 157

10.1.4基类初始化——向基类传递参数 159

10.1.5在派生类中覆盖基类的方法 160

10.1.6调用基类中被覆盖的方法 162

10.1.7在派生类中调用基类的方法 162

10.1.8在派生类中隐藏基类的方法 164

10.1.9构造顺序 165

10.1.10析构顺序 166

10.2私有继承 167

10.3保护继承 169

10.4切除问题 171

10.5多继承 171

10.6总结 174

10.7问与答 174

10.8 作业 174

10.8.1测验 174

10.8.2练习 174

第11章 多态 176

11.1多态基础 176

11.1.1为何需要多态行为 176

11.1.2使用虚函数实现多态行为 177

11.1.3为何需要虚构造函数 179

11.1.4虚函数的工作原理——理解虚函数表 182

11.1.5抽象基类和纯虚函数 184

11.2使用虚继承解决菱形问题 186

11.3可将复制构造函数声明为虚函数吗 189

11.4总结 191

11.5问与答 192

11.6作业 192

11.6.1测验 192

11.6.2练习 193

第12章 运算符类型与运算符重载 194

12.1 C++运算符 194

12.2单目运算符 195

12.2.1单目运算符的类型 195

12.2.2单目递增与单目递减运算符 195

12.2.3转换运算符 198

12.2.4解除引用运算符(*)和成员选择运算符(-﹥) 199

12.3双目运算符 202

12.3.1双目运算符的类型 202

12.3.2双目加法与双目减法运算符 202

12.3.3实现运算符+=与-= 204

12.3.4重载等于运算符(=)和不等运算符(!=) 206

12.3.5重载运算符﹤、﹥、﹤=和﹥= 207

12.3.6重载复制赋值运算符(=) 209

12.3.7下标运算符 211

12.4函数运算符operator() 214

12.5不能重载的运算符 219

12.6 总结 219

12.7问与答 220

12.8作业 220

12.8.1测验 220

12.8.2练习 220

第13章 类型转换运算符 221

13.1为何需要类型转换 221

13.2为何有些C++程序员不喜欢C风格类型转换 222

13.3 C++类型转换运算符 222

13.3.1使用static cast 222

13.3.2使用dynamic_ cast和运行阶段类型识别 223

13.3.3使用reinterpret cast 225

13.3.4使用const cast 226

13.4 C++类型转换运算符存在的问题 226

13.5总结 227

13.6问与答 227

13.7作业 228

13.7.1测验 228

13.7.2练习 228

第14章 宏和模板简介 229

14.1预处理器与编译器 229

14.2使用#defiine定义常量 229

14.3使用#define编写宏函数 232

14.3.1为什么要使用括号 233

14.3.2使用assert宏验证表达式 234

14.3.3使用宏函数的优点和缺点 235

14.4模板简介 235

14.4.1模板声明语法 235

14.4.2各种类型的模板声明 236

14.4.3模板函数 236

14.4.4模板与类型安全 238

14.4.5模板类 238

14.4.6模板的实例化和具体化 239

14.4.7声明包含多个参数的模板 239

14.4.8声明包含默认参数的模板 240

14.4.9一个模板示例 240

14.4.10模板类和静态成员 241

14.4.11在实际C++编程中使用模板 243

14.5总结 243

14.6问与答 244

14.7作业 244

14.7.1测验 244

14.7.2练习 244

第15章 标准模板库简介 245

15.1 STL容器 245

15.1.1顺序容器 245

15.1.2关联容器 246

15.1.3选择正确的容器 246

15.1.4容器适配器 247

15.2 STL迭代器 247

15.3 STL算法 248

15.4使用迭代器在容器和算法之间交互 248

15.5 STL字符串类 250

15.6总结 250

15.7问与答 250

15.8作业 251

第16章STL string类 252

16.1为何需要字符串操作类 252

16.2使用 STL string类 253

16.2.1实例化和复制STL string 253

16.2.2访问std::string的字符内容 254

16.2.3拼接字符串 256

16.2.4在string中查找字符或子字符串 257

16.2.5截短STL string 259

16.2.6字符串反转 260

16.2.7字符串的大小写转换 261

16.3基于模板的STL string实现 262

16.4总结 262

16.5问与答 262

16.6作业 263

16.6.1测验 263

16.6.2练习 263

第17章STL动态数组类 264

17.1 std::vector的特点 264

17.2典型的vector操作 264

17.2.1实例化vector 264

17.2.2使用push back()在末尾插入元素 266

17.2.3使用insert()在指定位置插入元素 267

17.2.4使用数组语法访问vector中的元素 269

17.2.5使用指针语法访问vector中的元素 270

17.2.6删除vector中的元素 271

17.3理解大小和容量 272

17.4 STL deque类 273

17.5总结 275

17.6问与答 275

17.7作业 276

17.7.1测验 276

17.7.2练习 276

第18章STL list和forward_list 277

18.1 std::list的特点 277

18.2基本的list操作 277

18.2.1实例化std::list对象 277

18.2.2在list开头或末尾插入元素 279

18.2.3在list中间插入元素 280

18.2.4删除list中的元素 282

18.3对list中的元素进行反转和排序 283

18.3.1使用list::reverse()反转元素的排列顺序 283

18.3.2对元素进行排序 284

18.3.3对包含对象的list进行排序以及删除其中的元素 286

18.4总结 290

18.5问与答 290

18.6作业 291

18.6.1测验 291

18.6.2练习 291

第19章STL集合类 292

19.1简介 292

19.2 STL set和multiset的基本操作 293

19.2.1实例化std::set对象 293

19.2.2在set或multiset中插入元素 294

19.2.3在STL set或multiset中查找元素 296

19.2.4删除STL set或multiset中的元素 297

19.3使用STL set和multiset的优缺点 300

19.4总结 303

19.5问与答 303

19.6作业 304

19.6.1测验 304

19.6.2练习 304

第20章STL映射类 305

20.1 STL映射类简介 305

20.2 std::map和std::multimap的基本操作 306

20.2.1实例化std::map和std::multimap 306

20.2.2在STL map或multimap中 307

插入元素 307

20.2.3在STL map或multimap中 309

查找元素 309

20.2.4在STL multimap中查找元素 311

20.2.5删除STL map或multimap中的元素 312

20.3提供自定义的排序谓词 313

20.3.1散列表的工作原理 316

20.3.2使用C++11散列表unordered_map和unordered multimap 316

20.4总结 319

20.5问与答 319

20.6作业 320

20.6.1 测验 320

20.6.2练习 320

第21章 理解函数对象 321

21.1函数对象与谓词的概念 321

21.2函数对象的典型用途 321

21.2.1一元函数 321

21.2.2一元谓词 325

21.2.3二元函数 326

21.2.4二元谓词 328

21.3总结 330

21.4问与答 330

21.5作业 330

21.5.1测验 330

21.5.2练习 330

第22章C+ lambda表达式 331

22.1 lambda表达式是什么 331

22.2如何定义lambda表达式 332

22.3一元函数对应的lambda表达式 332

22.4一元谓词对应的lambda表达式 333

22.5通过捕获列表接受状态变量的lambda表达式 334

22.6 lambda表达式的通用语法 335

22.7二元函数对应的lambda表达式 336

22.8二元谓词对应的lambda表达式 337

22.9总结 339

22.10问与答 340

22.11作业 340

22.11.1测验 340

22.11.2练习 340

第23章STL算法 341

23.1什么是STL算法 341

23.2 STL算法的分类 341

23.2.1非变序算法 341

23.2.2变序算法 342

23.3使用STL算法 343

23.3.1根据值或条件查找元素 343

23.3.2计算包含给定值或满足给定条件的元素数 345

23.3.3在集合中搜索元素或序列 346

23.3.4将容器中的元素初始化为指定值 348

23.3.5使用std::generate()将元素设置为运行阶段生成的值 349

23.3.6使用for each()处理指定范围内的元素 350

23.3.7使用std::transform()对范围进行变换 352

23.3.8复制和删除操作 354

23.3.9替换值以及替换满足给定条件的元素 356

23.3.10排序、在有序集合中搜索以及删除重复元素 357

23.3.11将范围分区 359

23.3.12在有序集合中插入元素 360

23.4总结 362

23.5问与答 362

23.6作业 363

23.6.1测验 363

23.6.2练习 363

第24章 自适应容器:栈和队列 364

24.1栈和队列的行为特征 364

24.1.1栈 364

24.1.2队列 365

24.2使用STL stack类 365

24.2.1实例化stack 365

24.2.2 stack的成员函数 366

24.2.3使用Push()和pop()在栈顶插入和删除元素 366

24.3使用STL queue类 367

24.3.1实例化queue 368

24.3.2 queue的成员函数 368

24.3.3使用push()在队尾插入以及使用PoP()从队首删除 369

24.4使用STL优先级队列 370

24.4.1实例化priority_queue类 370

24.4.2 priority_queue的成员函数 371

24.4.3使用push()在priority_queue末尾插入以及使用PoP()在 priority_queue开头删除 372

24.5总结 373

24.6问与答 373

24.7作业 374

24.7.1测验 374

24.7.2练习 374

第25章 使用STL位标志 375

25.1 bitset类 375

25.2使用std::bitset及其成员 376

25.2.1 std:bitset的运算符 376

25.2.2 std::bitset的成员方法 377

25.3 vector〈bool〉 378

25.3.1实例化vector〈bool〉 378

25.3.2 vector〈bool〉的成员函数和运算符 379

25.4总结 380

25.5问与答 380

25.6作业 381

25.6.1测验 381

25.6.2练习 381

第26章 理解智能指针 382

26.1什么是智能指针 382

26.1.1常规(原始)指针存在的问题 382

26.1.2智能指针有何帮助 383

26.2智能指针是如何实现的 383

26.3智能指针类型 384

26.3.1深复制 384

26.3.2写时复制机制 385

26.3.3引用计数智能指针 386

26.3.4引用链接智能指针 386

26.3.5破坏性复制 386

26.4深受欢迎的智能指针库 389

26.5总结 389

26.6问与答 389

26.7作业 390

26.7.1测试 390

26.7.2练习 390

第27章 使用流进行输入和输出 391

27.1流的概述 391

27.2重要的C++流类和流对象 391

27.3使用std::cout将指定格式的数据写入控制台 392

27.3.1使用std::cout修改数字的显示格式 393

27.3.2使用std::cout对齐文本和设置字段宽度 394

27.4使用std::cin进行输入 395

27.4.1使用std::cin将输入读取到基本类型变量中 395

27.4.2使用std::cin:get将输入读取到char数组中 396

27.4.3使用std::cin将输入读取到std::string中 397

27.5使用std::fstream处理文件 398

27.5.1使用open()和close()打开和关闭文件 398

27.5.2使用open()创建文本文件并使用运算符《写入文本 399

27.5.3使用open()和运算符》读取文本文件 399

27.5.4读写二进制文件 400

27.6使用std::stringstream对字符串进行转换 402

27.7总结 403

27.8问与答 403

27.9作业 403

27.9.1测验 403

27.9.2练习 404

第28章 异常处理 405

28.1什么是异常 405

28.2导致异常的原因 405

28.3使用try和catch捕获异常 406

28.3.1使用catch(…)处理所有异常 406

28.3.2捕获特定类型的异常 407

28.3.3使用throw引发特定类型的异常 408

28.4异常处理的工作原理 409

28.4.1 std::exception类 411

28.4.2从std::exception派生出自定义异常类 411

28.5总结 413

28.6问与答 413

28.7作业 413

28.7.1测验 414

28.7.2练习 414

第29章 继续前行 415

29.1当今的处理器有何不同 415

29.2如何更好地利用多个内核 416

29.2.1线程是什么 416

29.2.2为何要编写多线程应用程序 417

29.2.3线程如何交换数据 417

29.2.4使用互斥量和信号量同步线程 418

29.2.5多线程技术带来的问题 418

29.3编写杰出的C++代码 418

29.4更深入地学习C++ 419

29.4.1在线文档 419

29.4.2提供指南和帮助的社区 420

29.5总结 420

29.6问与答 420

29.7作业 420

附录A二进制和十六进制 421

A.1十进制 421

A.2二进制 421

A.2.1计算机为何使用二进制 422

A.2.2位和字节 422

A.2.3 1 KB相当于多少字节 422

A.3十六进制 422

A.4不同进制之间的转换 423

A.4.1通用转换步骤 423

A.4.2从十进制转换为二进制 423

A.4.3从十进制转换为十六进制 424

附录BC++关键字 425

附录C运算符优先级 426

附录D答案 427

附录E ASCII码 456