《C++高级编程(第2版)》是2013年清华大学出版社出版的图书。
C++是当今最流行的高级程式设计语言之一,常用于编写性能卓越的企业级面向对象程式,如游戏或大型商业软体。但一个无法规避的事实是:C++语法纷繁複杂,学习难度较大。如何才能化繁为简,全面系统地快速掌握C++知识呢? C++高级编程(第2版) 将为您提供完美答案。这本权威书籍在大量实例的引导下,解密C++中鲜为人知的特性,揭示最新版本C++11带来的显着变化,并探讨有助于提高代码质量和编程效率的编程方法、可重用设计模式和良好编程风格。
第Ⅰ部分专业的C++简介第1章C++速成 31.1C++基础知识 31.1.1小程式的“helloworld” 31.1.2名称空间 61.1.3变数 81.1.4运算符 91.1.5类型 121.1.6条件 141.1.7循环 161.1.8数组 181.1.9函式 191.2深入研究C++ 211.2.1指针以及动态记忆体 211.2.2C++中的字元串 241.2.3引用 251.2.4异常 261.2.5const的多种用法 271.3作为面向对象语言的C++ 281.4标準库 301.5第一个有用的C++程式 311.5.1雇员记录系统 311.5.2Employee类 321.5.3Database类 351.5.4用户界面 381.5.5评估程式 401.6本章小结 41第2章设计专业的C++程式 432.1程式设计概述 432.2程式设计的重要性 442.3C++设计的特点 462.4C++设计的两个原则 472.4.1抽象 472.4.2重用 482.5重用代码 492.5.1关于术语的说明 502.5.2决定是否重用代码 502.5.3重用代码的策略 522.5.4绑定第三方应用程式 562.5.5开放原始码库 562.5.6C++标準库 572.6设计模式以及技巧 582.7设计一个西洋棋程式 582.7.1需求 582.7.2设计步骤 592.8本章小结 63第3章面向对象设计 653.1过程化的思考方式 653.2面向对象思想 663.2.1类 663.2.2组件 663.2.3属性 673.2.4行为 673.2.5综合考虑 673.3生活在对象世界里 683.3.1过度使用对象 693.3.2过于通用的对象 693.4对象之间的关係 703.4.1“有一个”关係 703.4.2“是一个”关係(继承) 713.4.3“有一个”与“是一个”的区别 733.4.4Not-a关係 753.4.5层次结构 763.4.6多重继承 773.4.7混入类 783.5抽象 783.5.1接口与实现 783.5.2决定公开的接口 783.5.3设计成功的抽象 803.6本章小结 81第4章设计可重用代码 834.1重用哲学 834.2如何设计可重用的代码 844.2.1使用抽象 844.2.2构建理想的重用代码 854.2.3设计有用的接口 894.2.4协调通用性以及使用性 924.3本章小结 93第5章编码风格 955.1良好外观的重要性 955.1.1事先考虑 955.1.2良好风格的元素 965.2为代码编写文档 965.2.1使用注释的原因 965.2.2注释的风格 995.2.3本书的注释 1035.3分解 1035.3.1通过重构分解 1045.3.2通过设计分解 1045.3.3本书中的分解 1045.4命名 1045.4.1选择一个恰当的名称 1055.4.2命名约定 1055.5使用具有风格的语言特性 1075.5.1使用常量 1085.5.2使用引用代替指针 1085.5.3使用自定义异常 1085.6格式 1095.6.1关于大括弧对齐的争论 1095.6.2关于空格以及圆括弧的争论 1105.6.3空格以及制表符 1105.7风格的挑战 1105.8本章小结 111第Ⅱ部分专业的C++编码方法第6章熟悉类和对象 1156.1电子表格示例介绍 1156.2编写类 1166.2.1类定义 1166.2.2定义方法 1186.2.3使用对象 1226.3对象的生命周期 1236.3.1创建对象 1246.3.2销毁对象 1396.3.3对象赋值 1406.3.4複製以及赋值的区别 1426.4本章小结 144第7章掌握类与对象 1457.1对象的动态记忆体分配 1457.1.1Spreadsheet类 1467.1.2使用析构函式释放记忆体 1477.1.3处理複製以及赋值 1487.2定义数据成员的类型 1557.2.1静态数据成员 1557.2.2常量数据成员 1577.2.3引用数据成员 1587.2.4常量引用数据成员 1597.3与方法有关的更多内容 1597.3.1静态方法 1597.3.2const方法 1607.3.3方法重载 1627.3.4默认参数 1637.3.5内联方法 1647.4嵌套类 1657.5类内的枚举类型 1677.6友元 1687.7运算符重载 169
7.7.1示例:为SpreadsheetCell实现加法 1697.7.2重载算术运算符 1747.7.3重载比较运算符 1767.7.4创建具有运算符重载的类型 1777.8创建稳定的接口 1787.9本章小结 181第8章揭秘继承技术 1838.1使用继承构建类 1838.1.1扩展类 1848.1.2重写方法 1878.2使用继承重用代码 1908.2.1WeatherPrediction类 1908.2.2在子类中添加功能 1918.2.3在子类中替换功能 1928.3利用父类 1938.3.1父类构造函式 1938.3.2父类的析构函式 1958.3.3使用父类方法 1968.3.4向上转型以及向下转型 1988.4继承与多态性 2008.4.1回到电子表格 2008.4.2设计多态性的电子表格单元格 2008.4.3电子表格单元格的基类 2018.4.4独立的子类 2038.4.5利用多态性 2058.4.6考虑将来 2068.5多重继承 2078.5.1从多个类继承 2078.5.2名称冲突以及歧义基类 2088.6有趣而晦涩的继承问题 2118.6.1修改重写方法的特徵 2118.6.2继承构造函式(仅限C++11) 2158.6.3重写方法时的特殊情况 2188.6.4子类中的複製构造函式以及赋值运算符 2248.6.5virtual的真相 2258.6.6运行时类型工具 2288.6.7非public继承 2298.6.8虚基类 2308.7本章小结 231第9章理解灵活而奇特的C++ 2339.1引用 2339.1.1引用变数 2349.1.2引用数据成员 2369.1.3引用参数 2369.1.4引用作为返回值 2389.1.5使用引用还是指针 2389.1.6右值引用(仅限C++11) 2419.2关键字的疑问 2469.2.1const关键字 2469.2.2static关键字 2509.2.3非局部变数的初始化顺序 2549.3类型以及类型转换 2549.3.1typedef 2549.3.2函式指针typedef 2559.3.3类型别名(仅限C++11) 2569.3.4类型转换 2579.4作用域解析 2619.5C++11 2629.5.1统一初始化 2629.5.2可选函式语法 2649.5.3空指针文本 2659.5.4尖括弧 2659.5.5初始化列表 2669.5.6显式转换运算符 266
9.5.7特性 2679.5.8用户定义的字面量 2689.6头档案 2709.7C的实用工具 2719.7.1变长参数列表 2719.7.2预处理器宏 2739.8本章小结 274第10章错误处理 27510.1错误与异常 27510.1.1异常的含义 27610.1.2C++中异常的优点 27610.1.3C++中异常的缺点 27710.1.4我们的建议 27710.2异常机制 27710.2.1抛出并捕获异常 27810.2.2异常类型 28110.2.3抛出并捕获多个异常 28310.2.4未捕获的异常 28510.2.5抛出列表 28710.3异常与多态性 29110.3.1标準异常体系 29110.3.2在类层次结构中捕获异常 29310.3.3编写自己的异常类 29410.3.4嵌套异常(仅限C++11) 29710.4堆叠的释放与清理 29910.4.1使用智慧型指针 30010.4.2捕获、清理并重新抛出 30110.5常见的错误处理问题 30110.5.1记忆体分配错误 30110.5.2构造函式中的错误 30410.5.3构造函式的function-try-blocks 30610.5.4析构函式中的错误 30810.6综合套用 30810.7本章小结 312第11章深入探讨标準库 31311.1编码原则 31411.1.1使用模板 31411.1.2使用运算符重载 31711.2C++标準库概述 31711.2.1字元串 31711.2.2I/O流 31811.2.3本地化 31811.2.4智慧型指针 31811.2.5异常 31811.2.6数学工具 31911.2.7时间工具(仅限C++11) 31911.2.8随机数(仅限C++11) 31911.2.9编译时有理数运算(仅限C++11) 31911.2.10元组(仅限C++11) 31911.2.11正则表达式(仅限C++11) 32011.2.12标準模板库 32011.2.13STL算法 32611.2.14STL中还缺什幺 33311.3本章小结 333第12章理解容器与叠代器 33512.1容器概述 33512.1.1元素的需求 33612.1.2异常和错误检查 33812.1.3叠代器 33812.1.4C++11的变化 34012.2顺序容器 34212.3容器适配器 36612.3.1queue 36612.3.2priority_queue 36912.3.3stack 372
12.4关联容器 37312.4.1pair工具类 37312.5无序关联容器/哈希表(仅限C++11) 38712.6其他容器 39112.6.1标準C风格数组 39212.6.2string 39212.6.3流 39312.6.4bitset 39312.7本章小结 397第13章掌握STL算法 39913.1算法概述 39913.1.1find和find_if算法 40013.1.2accumulate算法 40213.1.3在算法中使用C++11的移动语义 40413.2lambda表达式(仅限C++11) 40413.2.1语法 40413.2.2捕捉块 40613.2.3将lambda表达式用作返回值 40613.2.4将lambda表达式用作参数 40713.2.5示例 40813.3函式对象 41013.3.1算术函式对象 41013.3.2比较函式对象 41113.3.3逻辑函式对象 41213.3.4按位函式对象(仅限C++11) 41213.3.5函式对象适配器 41313.3.6编写自己的函式对象 41913.4算法详解 42013.4.1工具算法 42113.4.2非修改算法 42213.4.3修改算法 42813.4.4排序算法 43613.4.5集合算法 43813.5算法示例:审核选民登记 44013.5.1选民登记审核问题描述 44013.5.2auditVoterRolls函式 44013.5.3getDuplicates函式 44113.5.4测试auditVoterRolls函式 44313.6本章小结 443第14章使用字元串与正则表达式 44514.1动态字元串 44514.1.1C风格字元串 44614.1.2字元串字面量 44714.1.3C++string类 44814.1.4原始字元串字面量(仅限C++11) 45114.2本地化 45214.2.1本地化字元串字面量 45214.2.2宽字元 45314.2.3非西方字元集 45314.2.4locale和facet 45514.3正则表达式(仅限C++11) 45714.3.1ECMAScript语法 45814.3.2regex库 46314.3.3regex_match() 46414.3.4regex_search() 46714.3.5regex_iterator 468
14.3.6regex_token_iterator 46914.3.7regex_replace() 47214.4本章小结 475第15章C++I/O揭秘 47715.1使用流 47715.1.1流的含义 47815.1.2流的来源和目标 47815.1.3流式输出 47915.1.4流式输入 48315.1.5对象的输入输出 48915.2字元串流 49115.3档案流 49215.3.1通过seek()和tell()在档案中转移 49315.3.2将流连线在一起 49515.4双向I/O 49615.5本章小结 497第16章其他库工具 49916.1STD::FUNCTION 49916.2有理数 50116.3Chrono库 50316.3.1持续时间 50316.3.2时钟 50716.3.3时点 50816.4生成随机数 50916.4.1随机数引擎 51016.4.2随机数引擎适配器 51216.4.3预定义的引擎和引擎适配器 51216.4.4生成随机数 51316.4.5随机数分布 51416.5元组 51716.6本章小结 520第17章自定义和扩展STL 52117.1分配器 52117.2叠代器适配器 52217.2.1反向叠代器 52217.2.2流叠代器 52417.2.3插入叠代器 52417.2.4移动叠代器(仅限C++11) 52517.3扩展STL 52717.3.1扩展STL的原因 52717.3.2编写一个STL算法 52717.3.3编写一个STL容器 53017.4本章小结 564第Ⅲ部分掌握C++的高级特性第18章C++运算符重载 56718.1运算符重载概述 56718.1.1重载运算符的原因 56818.1.2运算符重载的限制 56818.1.3运算符重载的决策 56818.1.4不要重载的运算符 57018.1.5可重载运算符小结 57118.1.6右值引用(仅限C++11) 57418.2重载算术运算符 57418.2.1重载一元负号和一元正号 57418.2.2重载递增和递减运算符 57518.3重载按位运算符和二元逻辑运算符 57718.4重载插入运算符和提取运算符 57718.5重载下标运算符 57918.5.1通过operator[]提供唯读访问 58218.5.2非整数数组索引 58318.6重载函式调用运算符 58318.7重载解除引用运算符 58518.8编写转换运算符 58818.8.1转换运算符的多义性问题 59018.8.2用于布尔表达式的转换 591
18.9重载记忆体分配和释放运算符 59318.9.1new和delete的工作原理 59318.10本章小结 599第19章利用模板编写泛型代码 60119.1模板概述 60219.2类模板 60219.2.1编写类模板 60219.2.2编译器处理模板的原理 61019.2.3将模板代码分布在多个档案中 61119.2.4模板参数 61219.2.5方法模板 61419.2.6模板类特例化 61919.2.7子类化模板类 62219.2.8继承还是特例化 62319.2.9模板别名(仅限C++11) 62319.2.10替换函式语法(仅限C++11) 62419.3函式模板 62519.3.1函式模板特例化 62619.3.2函式模板重载 62719.3.3类模板的friend函式模板 62819.4本章小结 629第20章模板的高级特性 63120.1深入了解模板参数 63120.1.1深入了解模板类型参数 63120.1.2模板参数模板介绍 63520.1.3深入了解非类型模板参数 63620.2模板类部分特例化 63920.3通过重载模拟函式部分特例化 64320.4模板递归 64520.4.1一个N维格线:初次尝试 64520.4.2一个真正的N维格线 64720.5类型推导(仅限C++11) 65220.5.1auto关键字 65220.5.2decltype关键字 65320.5.3结合模板使用auto和decltype 65320.6可变参数模板(仅限C++11) 65520.6.1类型安全的可变长度参数列表 65620.6.2可变数目的混入类 65820.7元编程 65920.7.1编译时阶乘 65920.7.2循环展开 66020.7.3列印元组(仅限C++11) 66120.7.4类型trait(仅限C++11) 66320.7.5结论 66820.8本章小结 668第21章高效的记忆体管理 66921.1使用动态记忆体 66921.1.1如何描绘记忆体 67021.1.2分配和释放 67121.1.3数组 67221.1.4使用指针 67921.2数组-指针的对偶性 68121.2.1数组就是指针 68121.2.2并非所有的指针都是数组 68221.3低级记忆体操作 68321.3.1指针运算 68321.3.2自定义记忆体管理 68421.3.3垃圾回收 68421.3.4对象池 68521.3.5函式指针 685
21.3.6方法和成员的指针 68721.4智慧型指针 68721.4.1旧的过时的auto_ptr 68821.4.2新的C++11智慧型指针 68821.4.3编写自己的智慧型指针类 69221.5.1分配不足的字元串 69721.5.2记忆体泄漏 69821.5.3双重删除和无效指针 70121.5.4访问记忆体越界 70121.6本章小结 702第22章C++多执行绪编程 70322.1简介 70322.2原子操作库 70722.2.1原子类型示例 70822.2.2原子操作 71022.3执行绪 71122.3.1通过函式指针创建执行绪 71222.3.2通过函式对象创建执行绪 71422.3.3通过lambda创建执行绪 71522.3.4通过成员函式创建执行绪 71622.3.5执行绪本地存储 71722.3.6取消执行绪 71722.3.7从执行绪获得结果 71722.3.8複製和重新抛出异常 71722.4互斥 72022.4.1互斥体类 72022.4.2锁 72122.4.3std::call_once 72322.4.4互斥体的用法示例 72422.5条件变数 72722.6future 72922.7示例:多执行绪日誌记录器类 73122.8执行绪池 73622.9执行绪设计和最佳实践 73722.10本章小结 738第Ⅳ部分C++软体工程第23章充分利用软体工程方法 74123.1过程的必要性 74123.2软体生命周期模型 74223.2.1分段模型和瀑布模型 74223.2.2螺旋模型 74523.2.3Rational统一过程 74723.3软体工程方法学 74823.3.1敏捷 74823.3.2Scrum 74823.3.3极限编程(XP) 75023.3.4软体分流 75423.4构建自己的过程和方法 75423.4.1对新思想採取开放态度 75423.4.2提出新想法 75423.4.3知道什幺行得通什幺行不通 75423.4.4不要逃避 75523.5原始码控制 75523.6本章小结 757第24章编写高效的C++程式 75924.1性能和效率概述 75924.1.1提升效率的两种方式 76024.1.2两种程式 76024.1.3C++是不是低效的语言 76024.2语言层次的效率 76124.2.1高效地操纵对象 76124.2.2使用内联方法和函式 765
24.3设计层次的效率 76524.3.1儘可能多地快取 76524.3.2使用对象池 76624.4剖析 77024.4.1使用gprof的剖析範例 77024.4.2使用VisualC++2010的剖析範例 77824.5本章小结 780第25章开发跨平台和跨语言的应用程式 78125.1跨平台开发 78125.1.1硬体架构问题 78225.1.2实现问题 78325.1.3平台相关的特性 78425.2跨语言开发 78525.2.1混合使用C和C++ 78525.2.2转移範例 78625.2.3和C代码连结 78825.2.4混合使用C#与C++ 79025.2.5通过JNI混合Java和C++ 79125.2.6混合C++使用Perl和shell脚本 79425.2.7混合使用C++和彙编代码 79725.3本章小结 798第26章成为测试专家 79926.1质量控制 80026.1.1测试是谁的职责 80026.1.2bug的生命周期 80026.1.3bug跟蹤工具 80126.2单元测试 80226.2.1单元测试的方法 80326.2.2单元测试过程 80326.2.3单元测试实例 80726.3更高级别的测试 81326.3.1集成测试 81326.3.2系统测试 81526.3.3回归测试 81526.4成功测试的技巧 81626.5本章小结 816第27章熟练掌握调试技术 81927.1调试的基本定律 81927.2bug分类学 82027.3避免bug 82027.4为bug做好规划 82027.4.1错误日誌 82127.4.2调试跟蹤 82227.4.3断言 83327.4.4静态断言(仅限C++11) 83427.5调试技术 83527.5.1重现bug 83527.5.2调试可重複的bug 83627.5.3调试不可重现的bug 83627.5.4调试记忆体问题 83727.5.5调试多执行绪程式 84127.5.6调试示例:文章引用 84127.5.7从ArticleCitations示例中总结的教训 85327.6本章小结 853第28章将设计技术和框架结合使用 85528.1C++编码示例 85628.1.1编写一个类 85628.1.2子类化已有的类 85728.1.3抛出和捕获异常 85828.1.4从档案中读取 85828.1.5写入档案 85928.1.6写一个模板类 85928.2肯定有更好的方法 86028.2.1双分派 86128.2.2混入类 86628.3面向对象的框架 868
28.3.1使用框架 86828.3.2模型-视图-控制器範例 86928.4本章小结 870第29章套用设计模式 87129.1叠代器模式 87229.2单实例模式 87229.2.1示例:一种日誌机制 87329.2.2实现一个单实例 87329.2.3使用一个单实例 87729.2.4单实例模式和多执行绪 87729.3工厂模式 88029.3.1示例:汽车工厂模拟 88029.3.2实现一个工厂 88229.3.3使用一个工厂 88429.3.4工厂的其他用途 88529.4代理模式 88529.4.1示例:隐藏网路连线的问题 88529.4.2实现一个代理 88629.4.3使用代理 88629.5适配器模式 88729.5.1示例:适配一个Logger类 88729.5.2实现一个适配器 88829.5.3使用适配器 88829.6装饰器模式 88929.6.1示例:在网页中定义样式 88929.6.2装饰器的实现 89029.6.3使用一个装饰器 89129.7责任链模式 89229.7.1示例:事件处理 89229.7.2责任链的实现 89229.7.3责任链的使用 89329.8观察者模式 89429.8.1示例:事件处理 89429.8.2观察者的实现 89429.8.3使用观察者 89529.9本章小结 896附录AC++面试 897附录B带注解的参考文献 917附录C标準库头档案 927
本文发布于:2023-03-26 07:40:17,感谢您对本站的认可!
本文链接:http://www.ranqi119.com/to/1680047503248403.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |