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

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

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

定 价:¥119.80

作 者:

[美]悉达多·饶(Siddhartha Rao)

出版社:

人民邮电出版社

丛编项:

标 签:

暂缺

购买这本书可以去

当当网 (¥89.80)

ISBN:

9787115616838

出版时间:

2023-08-01

包装:

平装-胶订

开本:

128开

页数:

字数:

内容简介

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

作者简介

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

图书目录

第 一部分 基础知识第 1章 绪论 21.1 C 简史 21.1.1 与C语言的关系 21.1.2 C 的优点 21.1.3 C 标准的发展历程 31.1.4 哪些人使用C 程序 31.2 编写C 应用程序 31.2.1 生成可执行文件的步骤 31.2.2 分析并修复错误 41.2.3 集成开发环境 41.2.4 编写第 一个C 应用程序 41.2.5 生成并执行第 一个C 应用程序 51.2.6 理解编译错误 71.3 C 20新增的功能 71.4 总结 81.5 问与答 81.6 作业 81.6.1 测验 81.6.2 练习 9第 2章 C 程序的组成部分 102.1 Hello World程序的组成部分 102.1.1 预处理器编译指令#include 102.1.2 程序的主体:main( ) 112.1.3 返回值 122.2 命名空间的概念 122.3 C 代码中的注释 132.4 C 函数 142.5 使用std::cin和std::cout执行基本输入输出操作 162.6 总结 172.7 问与答 172.8 作业 172.8.1 测验 182.8.2 练习 18第3章 使用变量和常量 193.1 什么是变量 193.1.1 内存和寻址概述 193.1.2 声明变量以访问和使用内存 193.1.3 声明并初始化多个类型相同的变量 213.1.4 理解变量的作用域 213.1.5 全局变量 223.1.6 命名约定 243.2 编译器支持的常见C 变量类型 243.2.1 使用bool变量存储布尔值 253.2.2 使用char变量存储字符 253.2.3 有符号整数和无符号整数的概念 263.2.4 有符号整型short、int、long和long long 263.2.5 无符号整型unsigned short、unsigned int、unsigned long和unsigned long long 263.2.6 选择正确的数据类型以免发生溢出错误 273.2.7 浮点类型float和double 283.3 使用sizeof确定变量的长度 283.4 使用auto自动推断类型 303.5 使用typedef替换变量类型 313.6 什么是常量 313.6.1 字面常量 323.6.2 使用const将变量声明为常量 323.6.3 使用constexpr定义常量表达式 333.6.4 使用consteval定义C 20即时函数 343.6.5 枚举 353.6.6 域限定枚举 373.6.7 使用#define定义常量 373.7 不能用作常量或变量名的关键字 373.8 总结 383.9 问与答 383.10 作业 393.10.1 测验 393.10.2 练习 40第4章 管理数组和字符串 414.1 什么是数组 414.1.1 为何需要数组 414.1.2 声明和初始化静态数组 424.1.3 数组中的数据是如何存储的 424.1.4 访问存储在数组中的数据 434.1.5 修改存储在数组中的数据 444.2 多维数组 464.2.1 声明和初始化多维数组 464.2.2 访问多维数组中的元素 474.3 动态数组 484.4 C风格字符串 494.5 C 字符串:使用std::string 514.6 总结 524.7 问与答 534.8 作业 534.8.1 测验 534.8.2 练习 53第5章 使用表达式、语句和运算符 545.1 语句 545.2 复合语句(语句块) 555.3 使用运算符 555.3.1 赋值运算符(=) 555.3.2 理解左值和右值 555.3.3 加法运算符( )、减法运算符( )、乘法运算符(*)、除法运算符(/)和求模运算符(%) 555.3.4 递增运算符( )和递减运算符( ) 565.3.5 使用前缀还是后缀 575.3.6 相等运算符(==)和不等运算符(!=) 585.3.7 关系运算符 585.3.8 C 20三向比较运算符 605.3.9 逻辑运算NOT、AND、OR和XOR 625.3.10 使用C 逻辑运算符!、 &&和|| 635.3.11 按位运算符~、&、|和^ 665.3.12 按位右移运算符(>>)和左移 运算符(<>5.3.13 复合赋值运算符 685.3.14 使用运算符sizeof( )确定特定类型 变量占用的内存量 705.3.15 运算符的优先级和结合性 715.4 总结 725.5 问与答 725.6 作业 735.6.1 测验 735.6.2 练习 73第6章 控制程序流程 746.1 使用if...else有条件地执行 746.1.1 使用if…else进行条件编程 756.1.2 有条件地执行语句块 766.1.3 嵌套if语句 786.1.4 使用switch-case进行条件处理 816.1.5 使用运算符 :进行条件处理 836.2 在循环中执行代码 846.2.1 不成熟的goto循环 856.2.2 while循环 866.2.3 do…while循环 886.2.4 for循环 896.2.5 基于范围的for循环 916.3 使用continue和break修改循环的行为 936.3.1 不结束的循环——无限循环 936.3.2 控制无限循环 946.4 编写嵌套循环 966.4.1 使用嵌套循环遍历多维数组 976.4.2 使用嵌套循环计算斐波那契数列 986.5 总结 996.6 问与答 1006.7 作业 1006.7.1 测验 1006.7.2 练习 100第7章 使用函数组织代码 1027.1 为何需要函数 1027.1.1 函数原型是什么 1037.1.2 函数定义是什么 1047.1.3 函数调用和实参是什么 1047.1.4 编写接收多个参数的函数 1047.1.5 编写没有参数和返回值的函数 1057.1.6 带默认值的函数参数 1067.1.7 递归函数——调用自己的函数 1087.1.8 包含多条return语句的函数 1097.2 使用函数处理不同类型的数据 1107.2.1 函数重载 1107.2.2 将数组传递给函数 1127.2.3 按引用传递参数 1137.3 微处理器如何处理函数调用 1147.3.1 内联函数 1157.3.2 自动推断返回类型 1167.3.3 lambda函数 1177.4 总结 1187.5 问与答 1187.6 作业 1197.6.1 测验 1197.6.2 练习 119第8章 阐述指针和引用 1218.1 什么是指针 1218.1.1 声明指针 1228.1.2 使用引用运算符(&)获取变量的地址 1228.1.3 使用指针存储地址 1238.1.4 使用解除引用运算符(*)访问指向的数据 1248.1.5 指针占用的内存量 1268.2 动态内存分配 1278.2.1 使用new和delete动态地分配和释放内存 1288.2.2 将递增和递减运算符( 和 )用于指针的结果 1308.2.3 将关键字const用于指针 1328.2.4 将指针传递给函数 1338.2.5 数组和指针的类似之处 1348.3 使用指针时常犯的编程错误 1368.3.1 内存泄漏 1368.3.2 指针指向无效的内存单元 1368.3.3 悬浮指针(也叫迷途或失控指针) 1378.3.4 检查使用new发出的分配请求是否得到满足 1388.4 指针编程最佳实践 1408.5 引用是什么 1408.5.1 是什么让引用很有用 1418.5.2 将关键字const用于引用 1438.5.3 按引用向函数传递参数 1438.6 总结 1448.7 问与答 1448.8 作业 1458.8.1 测验 1458.8.2 练习 145第二部分 C 面向对象编程基础第9章 类和对象 1489.1 类和对象 1489.1.1 声明类 1489.1.2 作为类实例的对象 1499.1.3 使用句点运算符(.)访问成员 1499.1.4 使用指针运算符(->)访问成员 1509.2 关键字public和private 1519.3 构造函数 1549.3.1 声明和实现构造函数 1549.3.2 何时及如何使用构造函数 1559.3.3 重载构造函数 1569.3.4 没有默认构造函数的类 1579.3.5 带默认值的构造函数参数 1589.3.6 包含初始化列表的构造函数 1599.4 析构函数 1619.4.1 声明和实现析构函数 1619.4.2 何时及如何使用析构函数 1629.5 复制构造函数 1639.5.1 浅复制及其存在的问题 1649.5.2 使用复制构造函数确保深复制 1669.5.3 使用移动构造函数改善性能 1699.6 构造函数和析构函数的其他用途 1709.6.1 不允许复制的类 1709.6.2 只能有一个实例的单例类 1709.6.3 禁止在栈中实例化的类 1729.6.4 使用构造函数进行类型转换 1749.7 this指针 1769.8 将sizeof( )用于类 1769.9 结构不同于类的地方 1789.10 声明友元 1799.11 共用体:一种特殊的数据存储机制 1809.11.1 声明共用体 1809.11.2 在什么情况下使用共用体 1819.12 对类和结构使用聚合初始化 1839.13 总结 1869.14 问与答 1869.15 作业 1879.15.1 测验 1879.15.2 练习 187第 10章 实现继承 18810.1 继承基础 18810.1.1 继承和派生 18910.1.2 C 派生语法 18910.1.3 访问限定符protected 19110.1.4 基类初始化——向基类传递参数 19310.1.5 在派生类中覆盖基类的方法 19510.1.6 调用基类中被覆盖的方法 19710.1.7 在派生类中调用基类的方法 19710.1.8 在派生类中隐藏基类的方法 19910.1.9 构造顺序 20110.1.10 析构顺序 20110.2 私有继承 20310.3 保护继承 20510.4 切除问题 20710.5 多继承 20810.6 使用final禁止继承 21010.7 总结 21010.8 问与答 21110.9 作业 21110.9.1 测验 21110.9.2 练习 211第 11章 多态 21311.1 多态基础 21311.1.1 为何需要多态行为 21311.1.2 使用虚函数实现多态行为 21411.1.3 为何需要虚构造函数 21611.1.4 虚函数的工作原理——理解虚函数表 21911.1.5 抽象基类和纯虚函数 22211.2 使用虚继承解决菱形问题 22411.3 使用限定符override明确覆盖意图 22711.4 使用final来禁止覆盖函数 22811.5 可将复制构造函数声明为虚函数吗 22911.6 总结 23211.7 问与答 23211.8 作业 23311.8.1 测验 23311.8.2 练习 233第 12章 运算符类型与运算符重载 23412.1 C 运算符 23412.2 单目运算符 23512.2.1 单目运算符的类型 23512.2.2 单目递增与单目递减运算符 23512.2.3 转换运算符 23812.2.4 解除引用运算符(*)和成员选择 运算符(->) 24012.3 双目运算符 24112.3.1 双目运算符的类型 24212.3.2 双目加法与双目减法运算符 24212.3.3 实现运算符 =与 = 24412.3.4 重载相等运算符(==)和不等 运算符(!=) 24512.3.5 重载运算符、= 24712.3.6 C 20三向比较运算符 () 25012.3.7 重载复制赋值运算符(=) 25212.3.8 索引运算符 25512.4 函数运算符( ) 25712.5 用于高性能编程的移动构造函数和 移动赋值运算符 25812.5.1 不必要的复制带来的问题 25812.5.2 声明移动构造函数和移动赋值 运算符 25812.6 用户定义的字面量 26312.7 不能重载的运算符 26512.8 总结 26512.9 问与答 26512.10 作业 26612.10.1 测验 26612.10.2 练习 266第 13章 类型转换运算符 26713.1 为何需要类型转换 26713.2 为何有些C 程序员不喜欢C风格 类型转换 26813.3 C 类型转换运算符 26813.3.1 使用static_cast 26813.3.2 使用dynamic_cast和运行阶段类型识别 26913.3.3 使用reinterpret_cast 27213.3.4 使用const_cast 27213.4 C 类型转换运算符存在的问题 27313.5 总结 27413.6 问与答 27413.7 作业 27513.7.1 测验 27513.7.2 练习 275第 14章 宏和模板简介 27614.1 预处理器与编译器 27614.2 使用#define定义常量 27614.3 使用#define编写宏函数 27914.3.1 为什么要使用括号 28014.3.2 使用assert宏验证表达式 28114.3.3 使用宏函数的优点和缺点 28214.4 模板简介 28314.4.1 模板声明语法 28314.4.2 各种类型的模板声明 28314.4.3 模板函数 28414.4.4 模板与类型安全 28514.4.5 模板类 28614.4.6 声明包含多个参数的模板 28614.4.7 声明包含默认参数的模板 28714.4.8 一个模板类示例:HoldsPair 28714.4.9 模板的实例化和具体化 28914.4.10 模板类和静态成员 29014.4.11 参数数量可变的模板 29114.4.12 使用static_assert执行编译阶段 检查 29414.4.13 在实际C 编程中使用模板 29514.5 总结 29514.6 问与答 29614.7 作业 29614.7.1 测验 29614.7.2 练习 296第三部分 学习标准模板库第 15章 标准模板库简介 29815.1 STL容器 29815.1.1 顺序容器 29815.1.2 关联容器 29915.1.3 容器适配器 29915.2 STL迭代器 30015.3 STL算法 30015.4 使用迭代器在容器和算法之间交互 30015.5 选择正确的容器 30215.6 STL字符串类 30315.7 总结 30315.8 问与答 30315.9 作业 304第 16章 STL string类 30516.1 为何需要字符串操作类 30516.2 使用STL string类 30616.2.1 实例化和复制STL string 30616.2.2 访问std::string的字符内容 30816.2.3 拼接字符串 31016.2.4 在string中查找字符或子 字符串 31116.2.5 截短STL string 31216.2.6 字符串反转 31416.2.7 字符串的大小写转换 31516.3 基于模板的STL string实现 31616.4 std::string中的operator ""s 31616.5 使用C 20改进了的std::string_view 31716.6 总结 31816.7 问与答 31916.8 作业 31916.8.1 测验 31916.8.2 练习 319第 17章 STL动态数组类 32017.1 std::vector的特点 32017.2 典型的vector操作 32017.2.1 实例化vector 32017.2.2 使用push_back( )在vector末尾 插入元素 32217.2.3 列表初始化 32217.2.4 使用insert( )在指定位置 插入元素 32317.2.5 使用数组语法访问vector中的 元素 32517.2.6 使用指针语法访问vector中的 元素 32617.2.7 删除vector中的元素 32717.3 理解大小和容量 32817.4 STL deque 类 32917.5 总结 33217.6 问与答 33217.7 作业 33317.7.1 测验 33317.7.2 练习 333第 18章 STL list和forward_list 33418.1 std::list的特点 33418.2 基本的list操作 33418.2.1 实例化std::list对象 33418.2.2 在list开头或末尾插入元素 33618.2.3 在list中间插入元素 33718.2.4 删除list中的元素 33918.3 对list中的元素进行反转和排序 34018.3.1 使用list::reverse( )反转元素的 排列顺序 34018.3.2 对元素进行排序 34118.3.3 对包含对象的list进行排序以及 删除其中的元素 34318.3.4 std::forward_list 34518.4 总结 34718.5 问与答 34718.6 作业 34818.6.1 测验 34818.6.2 练习 348第 19章 STL set和multiset 34919.1 简介 34919.2 STL set和multiset的基本操作 34919.2.1 实例化std::set对象 35019.2.2 在set或multiset中插入 元素 35119.2.3 在STL set或multiset中查找 元素 35319.2.4 删除STL set或multiset中的 元素 35419.3 使用STL set和multiset的优缺点 35819.4 总结 36019.5 问与答 36119.6 作业 36119.6.1 测验 36119.6.2 练习 361第 20章 STL map和multimap 36220.1 STL映射类简介 36220.2 STL map和multimap的基本操作 36320.2.1 实例化std::map和 std::multimap 36320.2.2 在STL map或multimap中 插入元素 36420.2.3 在STL map中查找元素 36620.2.4 在STL multimap中查找元素 36820.2.5 删除STL map或multimap中的 元素 36920.3 提供自定义的排序谓词 37120.4 基于键值对的STL散列表容器 37420.4.1 散列表的工作原理 37420.4.2 使用unordered_map和 unordered_multimap 37420.5 总结 37720.6 问与答 37820.7 作业 37820.7.1 测验 37820.7.2 练习 379第四部分 lambda表达式和STL算法第 21章 理解函数对象 38221.1 函数对象与谓词的概念 38221.2 函数对象的典型用途 38221.2.1 一元函数 38221.2.2 一元谓词 38621.2.3 二元函数 38721.2.4 二元谓词 38921.3 总结 39121.4 问与答 39221.5 作业 39221.5.1 测验 39221.5.2 练习 392第 22章 lambda表达式 39322.1 lambda表达式是什么 39322.2 如何定义lambda表达式 39422.2.1 捕获变量 39422.2.2 参数 39422.2.3 返回类型 39522.3 一元函数对应的lambda表达式 39522.4 一元谓词对应的lambda表达式 39622.5 通过捕获列表接收状态的lambda 表达式 39722.6 二元函数对应的lambda表达式 39922.7 二元谓词对应的lambda表达式 40022.8 总结 40222.9 问与答 40222.10 作业 40222.10.1 测验 40322.10.2 练习 403第 23章 STL算法 40423.1 什么是STL算法 40423.2 STL算法的分类 40423.2.1 非变序算法 40423.2.2 变序算法 40523.3 使用STL算法 40623.3.1 根据值或条件查找元素 40623.3.2 计算包含给定值或满足给定条件的元素数 40823.3.3 在集合中搜索元素或序列 40923.3.4 将容器中的元素初始化为 指定值 41123.3.5 使用std::generate( )将元素设置为运行阶段生成的值 41223.3.6 使用for_each( )处理指定范围内的元素 41423.3.7 使用std::transform( )对范围进行变换 41523.3.8 复制和删除操作 41723.3.9 替换值以及替换满足给定条件的元素 42023.3.10 对集合进行排序以及在有序集合中搜索和删除重复元素 42123.3.11 将范围分区 42323.3.12 在有序集合中插入元素 42423.3.13 使用C 20引入的std:: accumulate( )执行累积操作 42623.4 C 20约束算法 42623.5 总结 42823.6 问与答 42823.7 作业 42923.7.1 测验 42923.7.2 练习 429第 24章 自适应容器:栈和队列 43024.1 栈和队列的行为特征 43024.1.1 栈 43024.1.2 队列 43124.2 使用STL stack类 43124.2.1 实例化stack 43124.2.2 stack的成员函数 43224.2.3 使用push( )和pop( )在栈顶插入和删除元素 43324.3 使用STL queue类 43424.3.1 实例化queue 43424.3.2 queue的成员函数 43524.3.3 使用push( )在队尾插入以及使用pop( )从队首删除 43624.4 使用STL优先级队列 43724.4.1 实例化priority_queue类 43724.4.2 priority_queue的成员函数 43824.4.3 使用push( )在priority_queue末尾插入以及使用pop( )在priority_queue开头删除 43924.5 总结 44124.6 问与答 44124.7 作业 44124.7.1 测验 44124.7.2 练习 441第 25章 使用STL位标志 44225.1 bitset类 44225.2 使用std::bitset及其成员 44325.2.1 std::bitset中很有用的运算符 44325.2.2 std::bitset的成员方法 44425.3 vector 44625.3.1 实例化vector 44625.3.2 vector的成员函数和运算符 44725.4 总结 44825.5 问与答 44825.6 作业 44825.6.1 测验 44925.6.2 练习 449第五部分 C 进阶概念第 26章 理解智能指针 45226.1 什么是智能指针 45226.1.1 常规(原始)指针存在的问题 45226.1.2 智能指针有何帮助 45326.2 智能指针是如何实现的 45326.3 智能指针类型 45426.3.1 深复制 45426.3.2 写时拷贝机制 45626.3.3 引用计数智能指针 45626.3.4 引用链接智能指针 45626.3.5 破坏性复制 45726.3.6 使用std::unique_ptr 45826.4 深受欢迎的智能指针库 46026.5 总结 46026.6 问与答 46126.7 作业 46126.7.1 测试 46126.7.2 练习 461第 27章 使用流进行输入和输出 46227.1 流的概述 46227.2 重要的C 流类和流对象 46327.3 使用std::cout将指定格式的数据写入控制台 46427.3.1 使用std::cout修改数字的显示格式 46427.3.2 使用std::cout对齐文本和设置字段宽度 46627.4 使用std::cin进行输入 46627.4.1 使用std::cin将输入读取到基本类型变量中 46627.4.2 使用std::cin:get将输入读取到char* 缓冲区中 46727.4.3 使用std::cin将输入读取到std::string中 46827.5 使用std::fstream处理文件 46927.5.1 使用open( )和close( )打开和关闭文件 47027.5.2 使用open( )创建文本文件并使用运算符<>27.5.3 使用open( )和运算符>>读取文本文件 47127.5.4 读写二进制文件 47227.6 使用std::stringstream对字符串进行转换 47427.7 总结 47527.8 问与答 47527.9 作业 47627.9.1 测验 47627.9.2 练习 476第 28章 异常处理 47728.1 什么是异常 47728.2 导致异常的因素 47728.3 使用try和catch捕获异常 47728.3.1 使用catch(…)处理所有异常 47828.3.2 捕获特定类型的异常 47928.3.3 使用throw引发特定类型的异常 48028.4 异常处理的工作原理 48128.4.1 std::exception类 48328.4.2 从std::exception派生出自定义异常类 48328.5 总结 48528.6 问与答 48528.7 作业 48628.7.1 测验 48628.7.2 练习 486第 29章 C 20概念、范围、视图和适配器 48829.1 概念 48829.1.1 使用标准库提供的概念 48929.1.2 使用关键字requires定义自定义概念 49029.1.3 将概念用于类和对象 49229.2 范围库、视图和适配器 49429.2.1 视图和适配器 49529.2.2 范围库提供的适配器 49629.2.3 合并多个适配器 49829.3 总结 49929.4 问与答 49929.5 作业 49929.5.1 测验 49929.5.2 练习 500第30章 C 20线程 50130.1 多线程技术 50130.1.1 何谓线程 50130.1.2 为何要编写多线程应用程序 50130.1.3 使用C 20线程库 50230.1.4 线程如何交换数据 50430.1.5 使用互斥量和信号量同步线程 50430.2 总结 50430.3 问与答 50530.4 作业 505第31章 C 20模块和C 23 50631.1 模块 50631.1.1 #include

存在的问题 50631.1.2 C 20模块 50631.1.3 创建模块 50731.1.4 使用模块 50831.1.5 为何导入模块优于预处理器编译指令#include 50831.2 C 23有望引入的特性 50931.3 更深入地学习C 50931.3.1 在线文档 50931.3.2 提供指南和帮助的社区 50931.4 总结 50931.5 问与答 51031.6 作业 510附录A 二进制和十六进制 511A.1 十进制 511A.2 二进制 511A.2.1 计算机为何使用二进制 512A.2.2 位和字节 512A.2.3 1KB相当于多少字节 512A.3 十六进制 512A.4 不同进制之间的转换 513A.4.1 通用的转换步骤 513A.4.2 从十进制转换为二进制 513A.4.3 从十进制转换为十六进制 514附录B C 关键字 515附录C 编写杰出的C 代码 516附录D ASCII 517附录E 答案 520

相关推荐

易烊千玺在北京过亿豪宅曝光,竟然和好朋友王俊凯还是邻居……
耳朵有水声怎么回事
365bet官方投注

耳朵有水声怎么回事

🪐 09-02 👁️ 7966
沪江学习APP中加入社团的操作流程介绍
mobile.allsport365

沪江学习APP中加入社团的操作流程介绍

🪐 12-13 👁️ 7892