4.23文创礼盒,买2个减5元
欢迎光临中图网 请 | 注册

21天学通C++(第9版)

出版社:人民邮电出版社出版时间:2023-08-01
开本: 16开 页数: 558
中 图 价:¥88.7(7.4折) 定价  ¥119.8 登录后可看到会员价
加入购物车 收藏
运费6元,满69元免运费
?快递不能达地区使用邮政小包,运费14元起
云南、广西、海南、新疆、青海、西藏六省,部分地区快递不可达
本类五星书更多>

21天学通C++(第9版) 版权信息

21天学通C++(第9版) 本书特色

1.本书详细分析了近300个带有详细注释的代码示例,覆盖C 20和C 23语言特性,并描述了其内部工作原理。无论是初学者还是专业程序员,都能了解到本书所具有的宝贵价值。

2.本书通过科学合理的内容安排让读者在21天内学通C ,符合读者期望快速入门C 的心理。

3.本书通过“注意”“警告”“提示”“黑名单”“白名单”等板块设计让读者轻松愉快地学会C 。

4.本书提供可下载的代码示例,方便读者亲手实践。

21天学通C++(第9版) 内容简介

这是一本经典的C++编程入门指南,第9版针对C++20标准进行了内容上的全面更新,旨在帮助读者编写更快、更简单、更可靠的C++代码,并掌握C++和面向对象编程的基本原理。 本书通过大量短小精悍的程序详细而全面地阐述了C++的基本概念和技术应用,以及C++20新增的功能,这些内容被组织成结构合理、联系紧密的章节。每章都提供了示例程序清单,并辅以示例输出和代码分析,以进一步阐述该章的主题。为帮助读者巩固所学的内容,每章末尾都提供了常见问题相关答案以及作业。读者可对照附录E提供的答案,了解自己对所学内容的掌握程度。 本书面向C++初学者,不要求读者有C语言方面的背景知识,可作为高等院校教授C++课程的教材,也可供初学者自学C++时使用。

21天学通C++(第9版) 目录

第 一部分 基础知识

第 1章 绪论 2

1.1 C 简史 2

1.1.1 与C语言的关系 2

1.1.2 C 的优点 2

1.1.3 C 标准的发展历程 3

1.1.4 哪些人使用C 程序 3

1.2 编写C 应用程序 3

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

1.2.2 分析并修复错误 4

1.2.3 集成开发环境 4

1.2.4 编写第 一个C 应用程序 4

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

1.2.6 理解编译错误 7

1.3 C 20新增的功能 7

1.4 总结 8

1.5 问与答 8

1.6 作业 8

1.6.1 测验 8

1.6.2 练习 9

第 2章 C 程序的组成部分 10

2.1 Hello World程序的组成部分 10

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

2.1.2 程序的主体:main( ) 11

2.1.3 返回值 12

2.2 命名空间的概念 12

2.3 C 代码中的注释 13

2.4 C 函数 14

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

2.6 总结 17

2.7 问与答 17

2.8 作业 17

2.8.1 测验 18

2.8.2 练习 18

第3章 使用变量和常量 19

3.1 什么是变量 19

3.1.1 内存和寻址概述 19

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

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

3.1.4 理解变量的作用域 21

3.1.5 全局变量 22

3.1.6 命名约定 24

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

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

3.2.2 使用char变量存储字符 25

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

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

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

3.2.6 选择正确的数据类型以免发生溢出错误 27

3.2.7 浮点类型float和double 28

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

3.4 使用auto自动推断类型 30

3.5 使用typedef替换变量类型 31

3.6 什么是常量 31

3.6.1 字面常量 32

3.6.2 使用const将变量声明为常量 32

3.6.3 使用constexpr定义常量表达式 33

3.6.4 使用consteval定义C 20即时函数 34

3.6.5 枚举 35

3.6.6 域限定枚举 37

3.6.7 使用#define定义常量 37

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

3.8 总结 38

3.9 问与答 38

3.10 作业 39

3.10.1 测验 39

3.10.2 练习 40

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

4.1 什么是数组 41

4.1.1 为何需要数组 41

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

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

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

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

4.2 多维数组 46

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

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

4.3 动态数组 48

4.4 C风格字符串 49

4.5 C 字符串:使用std::string 51

4.6 总结 52

4.7 问与答 53

4.8 作业 53

4.8.1 测验 53

4.8.2 练习 53

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

5.1 语句 54

5.2 复合语句(语句块) 55

5.3 使用运算符 55

5.3.1 赋值运算符(=) 55

5.3.2 理解左值和右值 55

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

5.3.4 递增运算符( )和递减运算符( ) 56

5.3.5 使用前缀还是后缀 57

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

5.3.7 关系运算符 58

5.3.8 C 20三向比较运算符 60

5.3.9 逻辑运算NOT、AND、OR和XOR 62

5.3.10 使用C 逻辑运算符!、 &&和|| 63

5.3.11 按位运算符~、&、|和^ 66

5.3.12 按位右移运算符(>>)和左移 运算符()访问成员 150

9.2 关键字public和private 151

9.3 构造函数 154

9.3.1 声明和实现构造函数 154

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

9.3.3 重载构造函数 156

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

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

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

9.4 析构函数 161

9.4.1 声明和实现析构函数 161

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

9.5 复制构造函数 163

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

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

9.5.3 使用移动构造函数改善性能 169

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

9.6.1 不允许复制的类 170

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

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

9.6.4 使用构造函数进行类型转换 174

9.7 this指针 176

9.8 将sizeof( )用于类 176

9.9 结构不同于类的地方 178

9.10 声明友元 179

9.11 共用体:一种特殊的数据存储机制 180

9.11.1 声明共用体 180

9.11.2 在什么情况下使用共用体 181

9.12 对类和结构使用聚合初始化 183

9.13 总结 186

9.14 问与答 186

9.15 作业 187

9.15.1 测验 187

9.15.2 练习 187

第 10章 实现继承 188

10.1 继承基础 188

10.1.1 继承和派生 189

10.1.2 C 派生语法 189

10.1.3 访问限定符protected 191

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

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

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

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

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

10.1.9 构造顺序 201

10.1.10 析构顺序 201

10.2 私有继承 203

10.3 保护继承 205

10.4 切除问题 207

10.5 多继承 208

10.6 使用final禁止继承 210

10.7 总结 210

10.8 问与答 211

10.9 作业 211

10.9.1 测验 211

10.9.2 练习 211

第 11章 多态 213

11.1 多态基础 213

11.1.1 为何需要多态行为 213

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

11.1.3 为何需要虚构造函数 216

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

11.1.5 抽象基类和纯虚函数 222

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

11.3 使用限定符override明确覆盖意图 227

11.4 使用final来禁止覆盖函数 228

11.5 可将复制构造函数声明为虚函数吗 229

11.6 总结 232

11.7 问与答 232

11.8 作业 233

11.8.1 测验 233

11.8.2 练习 233

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

12.1 C 运算符 234

12.2 单目运算符 235

12.2.1 单目运算符的类型 235

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

12.2.3 转换运算符 238

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

12.3 双目运算符 241

12.3.1 双目运算符的类型 242

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

12.3.3 实现运算符 =与 = 244

12.3.4 重载相等运算符(==)和不等 运算符(!=) 245

12.3.5 重载运算符、= 247

12.3.6 C 20三向比较运算符 () 250

12.3.7 重载复制赋值运算符(=) 252

12.3.8 索引运算符 255

12.4 函数运算符( ) 257

12.5 用于高性能编程的移动构造函数和 移动赋值运算符 258

12.5.1 不必要的复制带来的问题 258

12.5.2 声明移动构造函数和移动赋值 运算符 258

12.6 用户定义的字面量 263

12.7 不能重载的运算符 265

12.8 总结 265

12.9 问与答 265

12.10 作业 266

12.10.1 测验 266

12.10.2 练习 266

第 13章 类型转换运算符 267

13.1 为何需要类型转换 267

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

13.3 C 类型转换运算符 268

13.3.1 使用static_cast 268

13.3.2 使用dynamic_cast和运行阶段类型识别 269

13.3.3 使用reinterpret_cast 272

13.3.4 使用const_cast 272

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

13.5 总结 274

13.6 问与答 274

13.7 作业 275

13.7.1 测验 275

13.7.2 练习 275

第 14章 宏和模板简介 276

14.1 预处理器与编译器 276

14.2 使用#define定义常量 276

14.3 使用#define编写宏函数 279

14.3.1 为什么要使用括号 280

14.3.2 使用assert宏验证表达式 281

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

14.4 模板简介 283

14.4.1 模板声明语法 283

14.4.2 各种类型的模板声明 283

14.4.3 模板函数 284

14.4.4 模板与类型安全 285

14.4.5 模板类 286

14.4.6 声明包含多个参数的模板 286

14.4.7 声明包含默认参数的模板 287

14.4.8 一个模板类示例:HoldsPair 287

14.4.9 模板的实例化和具体化 289

14.4.10 模板类和静态成员 290

14.4.11 参数数量可变的模板 291

14.4.12 使用static_assert执行编译阶段 检查 294

14.4.13 在实际C 编程中使用模板 295

14.5 总结 295

14.6 问与答 296

14.7 作业 296

14.7.1 测验 296

14.7.2 练习 296

第三部分 学习标准模板库

第 15章 标准模板库简介 298

15.1 STL容器 298

15.1.1 顺序容器 298

15.1.2 关联容器 299

15.1.3 容器适配器 299

15.2 STL迭代器 300

15.3 STL算法 300

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

15.5 选择正确的容器 302

15.6 STL字符串类 303

15.7 总结 303

15.8 问与答 303

15.9 作业 304

第 16章 STL string类 305

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

16.2 使用STL string类 306

16.2.1 实例化和复制STL string 306

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

16.2.3 拼接字符串 310

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

16.2.5 截短STL string 312

16.2.6 字符串反转 314

16.2.7 字符串的大小写转换 315

16.3 基于模板的STL string实现 316

16.4 std::string中的operator ""s 316

16.5 使用C 20改进了的

std::string_view 317

16.6 总结 318

16.7 问与答 319

16.8 作业 319

16.8.1 测验 319

16.8.2 练习 319

第 17章 STL动态数组类 320

17.1 std::vector的特点 320

17.2 典型的vector操作 320

17.2.1 实例化vector 320

17.2.2 使用push_back( )在vector末尾 插入元素 322

17.2.3 列表初始化 322

17.2.4 使用insert( )在指定位置 插入元素 323

17.2.5 使用数组语法访问vector中的 元素 325

17.2.6 使用指针语法访问vector中的 元素 326

17.2.7 删除vector中的元素 327

17.3 理解大小和容量 328

17.4 STL deque 类 329

17.5 总结 332

17.6 问与答 332

17.7 作业 333

17.7.1 测验 333

17.7.2 练习 333

第 18章 STL list和forward_list 334

18.1 std::list的特点 334

18.2 基本的list操作 334

18.2.1 实例化std::list对象 334

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

18.2.3 在list中间插入元素 337

18.2.4 删除list中的元素 339

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

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

18.3.2 对元素进行排序 341

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

18.3.4 std::forward_list 345

18.4 总结 347

18.5 问与答 347

18.6 作业 348

18.6.1 测验 348

18.6.2 练习 348

第 19章 STL set和multiset 349

19.1 简介 349

19.2 STL set和multiset的基本操作 349

19.2.1 实例化std::set对象 350

19.2.2 在set或multiset中插入 元素 351

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

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

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

19.4 总结 360

19.5 问与答 361

19.6 作业 361

19.6.1 测验 361

19.6.2 练习 361

第 20章 STL map和multimap 362

20.1 STL映射类简介 362

20.2 STL map和multimap的基本操作 363

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

20.2.2 在STL map或multimap中 插入元素 364

20.2.3 在STL map中查找元素 366

20.2.4 在STL multimap中查找元素 368

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

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

20.4 基于键值对的STL散列表容器 374

20.4.1 散列表的工作原理 374

20.4.2 使用unordered_map和 unordered_multimap 374

20.5 总结 377

20.6 问与答 378

20.7 作业 378

20.7.1 测验 378

20.7.2 练习 379

第四部分 lambda表达式和STL算法

第 21章 理解函数对象 382

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

21.2 函数对象的典型用途 382

21.2.1 一元函数 382

21.2.2 一元谓词 386

21.2.3 二元函数 387

21.2.4 二元谓词 389

21.3 总结 391

21.4 问与答 392

21.5 作业 392

21.5.1 测验 392

21.5.2 练习 392

第 22章 lambda表达式 393

22.1 lambda表达式是什么 393

22.2 如何定义lambda表达式 394

22.2.1 捕获变量 394

22.2.2 参数 394

22.2.3 返回类型 395

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

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

22.5 通过捕获列表接收状态的lambda 表达式 397

22.6 二元函数对应的lambda表达式 399

22.7 二元谓词对应的lambda表达式 400

22.8 总结 402

22.9 问与答 402

22.10 作业 402

22.10.1 测验 403

22.10.2 练习 403

第 23章 STL算法 404

23.1 什么是STL算法 404

23.2 STL算法的分类 404

23.2.1 非变序算法 404

23.2.2 变序算法 405

23.3 使用STL算法 406

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

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

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

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

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

23.3.6 使用for_each( )处理指定范围内的元素 414

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

23.3.8 复制和删除操作 417

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

23.3.10 对集合进行排序以及在有序集合中搜索和删除重复元素 421

23.3.11 将范围分区 423

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

23.3.13 使用C 20引入的std:: accumulate( )执行累积操作 426

23.4 C 20约束算法 426

23.5 总结 428

23.6 问与答 428

23.7 作业 429

23.7.1 测验 429

23.7.2 练习 429

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

24.1 栈和队列的行为特征 430

24.1.1 栈 430

24.1.2 队列 431

24.2 使用STL stack类 431

24.2.1 实例化stack 431

24.2.2 stack的成员函数 432

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

24.3 使用STL queue类 434

24.3.1 实例化queue 434

24.3.2 queue的成员函数 435

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

24.4 使用STL优先级队列 437

24.4.1 实例化priority_queue类 437

24.4.2 priority_queue的成员函数 438

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

24.5 总结 441

24.6 问与答 441

24.7 作业 441

24.7.1 测验 441

24.7.2 练习 441

第 25章 使用STL位标志 442

25.1 bitset类 442

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

25.2.1 std::bitset中很有用的运算符 443

25.2.2 std::bitset的成员方法 444

25.3 vector 446

25.3.1 实例化vector 446

25.3.2 vector的成员函数和运算符 447

25.4 总结 448

25.5 问与答 448

25.6 作业 448

25.6.1 测验 449

25.6.2 练习 449

第五部分 C 进阶概念

第 26章 理解智能指针 452

26.1 什么是智能指针 452

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

26.1.2 智能指针有何帮助 453

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

26.3 智能指针类型 454

26.3.1 深复制 454

26.3.2 写时拷贝机制 456

26.3.3 引用计数智能指针 456

26.3.4 引用链接智能指针 456

26.3.5 破坏性复制 457

26.3.6 使用std::unique_ptr 458

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

26.5 总结 460

26.6 问与答 461

26.7 作业 461

26.7.1 测试 461

26.7.2 练习 461

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

27.1 流的概述 462

27.2 重要的C 流类和流对象 463

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

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

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

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

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

27.4.2 使用std::cin:get将输入读取到char* 缓冲区中 467

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

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

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

27.5.2 使用open( )创建文本文件并使用运算符>读取文本文件 471

27.5.4 读写二进制文件 472

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

27.7 总结 475

27.8 问与答 475

27.9 作业 476

27.9.1 测验 476

27.9.2 练习 476

第 28章 异常处理 477

28.1 什么是异常 477

28.2 导致异常的因素 477

28.3 使用try和catch捕获异常 477

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

28.3.2 捕获特定类型的异常 479

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

28.4 异常处理的工作原理 481

28.4.1 std::exception类 483

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

28.5 总结 485

28.6 问与答 485

28.7 作业 486

28.7.1 测验 486

28.7.2 练习 486

第 29章 C 20概念、范围、视图和适配器 488

29.1 概念 488

29.1.1 使用标准库提供的概念 489

29.1.2 使用关键字requires定义自定义概念 490

29.1.3 将概念用于类和对象 492

29.2 范围库、视图和适配器 494

29.2.1 视图和适配器 495

29.2.2 范围库提供的适配器 496

29.2.3 合并多个适配器 498

29.3 总结 499

29.4 问与答 499

29.5 作业 499

29.5.1 测验 499

29.5.2 练习 500

第30章 C 20线程 501

30.1 多线程技术 501

30.1.1 何谓线程 501

30.1.2 为何要编写多线程应用程序 501

30.1.3 使用C 20线程库 502

30.1.4 线程如何交换数据 504

30.1.5 使用互斥量和信号量同步线程 504

30.2 总结 504

30.3 问与答 505

30.4 作业 505

第31章 C 20模块和C 23 506

31.1 模块 506

31.1.1 #include 存在的问题 506

31.1.2 C 20模块 506

31.1.3 创建模块 507

31.1.4 使用模块 508

31.1.5 为何导入模块优于预处理器编译指令#include 508

31.2 C 23有望引入的特性 509

31.3 更深入地学习C  509

31.3.1 在线文档 509

31.3.2 提供指南和帮助的社区 509

31.4 总结 509

31.5 问与答 510

31.6 作业 510

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

A.1 十进制 511

A.2 二进制 511

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

A.2.2 位和字节 512

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

A.3 十六进制 512

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

A.4.1 通用的转换步骤 513

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

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

附录B C 关键字 515

附录C 编写杰出的C 代码 516

附录D ASCII 517

附录E 答案 520
展开全部

21天学通C++(第9版) 作者简介

悉达多·饶(Siddhartha Rao)是SAP SE公司主管产品安全的副总裁,其作品享誉全球,并被翻译成法语和中文。他深信C 发展快速,并致力于为机器学习和人工智能领域的发展添砖加瓦。

商品评论(0条)
暂无评论……
书友推荐
本类畅销
编辑推荐
返回顶部
中图网
在线客服