C++23高级编程 收藏

  • 书籍语言:简体中文
  • 下载次数:4802
  • 书籍类型:Epub+Txt+pdf+mobi
  • 创建日期:2025-09-07 18:10:02
  • 发布日期:2025-09-07
  • 连载状态:全集
  • 书籍作者:马克·格雷瓜尔
  • 运行环境:pc/安卓/iPhone/iPad/Kindle/平板

内容简介

全新修订的《C++23高级编程》(第6版)延续经典之作的深厚底蕴,由资深软件工程师Marc Gregoire执笔撰写,再次为“高阶编程”指南树立新标杆。本书几乎涵盖代号为C++23的新标准的所有特性,并通过经Windows与Linux平台测试的大量实战代码案例,提供深入、透彻的解析。

C++的功能极其广泛,是游戏和商业软件中最流行的高级程序设计语言之一。然而,无法回避的事实是:C++十分复杂,难以掌握。《C++23高级编程(第6版)》将让C++专业人员能跟上最新的发展潮流,保持技术领先。

高效进阶C++:

一本助你快速精通C++知识的权威指南

作为追求卓越的C++开发者的首选资源,本书助你实现以下目标。

● 精通C++23最新特性:精准掌握C++23新标准

● 最大化C++潜能:通过高效设计方案释放性能

● 规避开发陷阱:揭示冷门知识点与常见反模式

● 测试与调试之道:学习行业最佳实践

● 性能调优秘籍:掌握提升效率的关键技巧


作者简介

Marc Gregoire是一位软件项目经理/软件架构师,深耕C/C++开发,尤精Microsoft VC++及MFC框架,拥有开发7×24小时运行于Windows和Linux平台的C++程序的经验(如KNX/EIB家庭自动化软件)。除了C/C++,Marc也擅长C#。

Marc是比利时C++用户组创始人,畅销技术图书Professional C++(第2~6版)的作者,C++ Standard Library Quick Reference(第1~2版)的共同作者,多家出版社多部技术书籍的特约编辑,CppCon C++大会常驻演讲嘉宾,CodeGuru论坛成员(用户名:Marc G)。自2007年以来,他凭借在Visual C++领域的技术影响力,连续十多年荣获微软MVP年度奖项。

Marc毕业于比利时鲁汶大学,先后获得计算机科学工程硕士学位和AI专业的高级硕士学位。职业生涯初期,Marc加入比利时软件咨询公司Ordina,担任技术顾问,主导开发Siemens 和Nokia Siemens Networks面向电信运营商的关键2G/3G系统 (基于Solaris平台),项目团队横跨南美、美国、欧洲、中东、非洲及亚洲多地。Marc现任职于精密光学仪器与工业检测技术领军企业尼康计量(Nikon Metrology),负责X射线、CT及三维几何检测领域的软件架构设计与项目管理。


编辑推荐

技术领袖力荐

李建忠、吴咏炜、高博、钱能、朱燕民、吴天明、杨文波、郭龙江、王雷联袂推荐!C++头部自媒体“程序喵大人”领衔翻译 。


唯一全面覆盖C++23新特性:

深入解析模块(import std)、std::println格式化输出、范围库、协程等新标准,代码示例均基于C++23重构。


现代C++实践指南:

摒弃传统C++风格代码,倡导智能指针、范围循环、结构化绑定等现代范式,提供“零历史包袱”的学习路径。


案例驱动教学:

通过跨平台(Windows/Linux)测试的实战代码,详解高性能程序设计、内存管理陷阱及并发编程技巧。


工程方法论全覆盖:

独有章节探讨软件生命周期管理(敏捷/瀑布模型)、单元测试、调试技术(内存泄漏检测)、设计模式(工厂/观察者模式)。

性能优化秘籍:

专章剖析性能瓶颈定位(gprof/Visual Studio剖析器)、高效缓存策略、对象池技术等工业级调优方案。


配套AI编程资源:

附赠《Vibe Coding 浪潮下的 C++》文档、源代码、附录(面试指南/UML图解), 扫描封底二维码获取。


下载地址

序言

丹麦计算机科学家Bjarne Stroustrup于1982年发明了C++;C++继承于C,同时引入了类。1985年,发布了第一版的“C++程序设计语言”。第一个标准化版本的C++在1998年发布,称为C++98。在2003年,C++03发布并包含了一些小的更新。在那之后,C++沉默了一段时间,但吸引力开始慢慢增强,导致该语言在2011年进行了重大更新,称为C++11。从那以后,C++标准委员会以3年为周期发布更新的版本,出现了C++14、C++17、C++20及现在的C++23。总之,2023年发布了C++23之后,C++已经将近40岁了,并且仍然很强大。在2023年的大多数编程语言排名中,C++都排在前4位。它被广泛用于各种硬件,从带有嵌入式微处理器的小型设备一直到超级计算机。除了广泛的硬件支持,C++还可以用来完成几乎任何编程工作,包括移动平台上的游戏、对性能要求极高的人工智能(AI)和机器学习(ML)软件、自动驾驶汽车的组件、实时3D图形引擎、底层硬件驱动程序、完整的操作系统、网络设备的软件栈、网页浏览器等。C++程序很难与任何其他编程语言相匹配,因此,多年来,C++都是编写性能卓越、功能强大的企业级面向对象程序的事实标准语言。大型科技公司,如微软、Facebook、亚马逊、谷歌等,使用用 C++编写的服务来运行其基础设施。尽管C++语言已经风靡全球,但这种语言难以完全掌握。专业C++程序员使用一些简单但高效的技术,这些技术并未出现在传统教材中;即使是经验丰富的C++程序员,也未必完全了解C++中某些很有用的特性。

编程书籍往往重点描述语言的语法,而不是语言在真实世界中的应用。典型的C++教材在每一章中介绍语言中的大部分知识,讲解语法并列举示例。本书不遵循这种模式。本书并不讲解语言的大量细节并给出少量真实世界的场景,而是教你如何在真实世界中使用C++。本书还会讲解一些鲜为人知的让编程更简单的特性,以及区分编程新手和专业程序员的编程技术。

读者对象

就算使用C++已经多年,你仍可能不熟悉C++的一些高级特性,或仍不具有使用这门语言的全面能力。也许你编写过实用的C++代码,但还想学习更多有关C++中设计和良好编程风格的内容。也许你还不太了解最新版本 C++23 中引入的所有新特性。也许你是C++新手,想在入门时就掌握“正确”的编程方式。本书能满足上述需求,将你的C++技能提升到专业水准。

因为本书专注于将你从对C++具有基本或中等了解水平蜕变为一名专业C++程序员,所以本书假设你对该语言具有一定程度的认识。第1章涵盖C++的一些基础知识,可以当成复习材料,但是不能替代实际的语言培训和语言使用手册。如果你刚开始接触C++,但有十分丰富的C、Java或C#语言经验,那么应该能从第1章获得所需的大部分知识。

不管属于哪种情况,都应该具有很好的编程基础。应该知道循环、函数和变量。应该知道如何组织一个程序,而且应该熟悉基本技术,例如递归。应该了解一些常见的数据结构(如队列)及有用的算法(如排序和搜索)。不需要预先了解有关面向对象编程的知识——??这是第5章讲解的内容。

你还应该熟悉开发代码时使用的编译器。稍后将简要介绍Microsoft Visual C++和GCC这两种编译器。要了解其他编译器,请参阅编译器自带的指南。

本书主要内容

阅读本书是学习C++语言的一种方法,通过阅读本书既能提升编码质量,又能提升编程效率。本书贯穿对C++23新特性的讨论。这些新的C++特性并不是独立在某几章中,而是穿插于全书,在有必要的情况下,所有例子都已更新为使用这些新特性。

本书不仅讲解C++语法和语言特性,还强调编程方法论、可重用的设计模式以及良好的编程风格。本书讲解的方法论覆盖整个软件开发过程——从设计和编码,到调试以及团队协作。这种方法可让你掌握C++语言及其独有特性,还能在大型软件开发中充分利用C++语言的强大功能。

想象一下有人学习了C++的所有语法但没有见过一个使用C++例子的情形。他所了解的知识会让他处于非常危险的境地。如果没有示例的引导,他可能认为所有源代码都要放在程序的main()函数中,还可能认为所有变量都应该为全局变量——??这些都不是良好的编程实践。

专业的C++程序员除了理解语法外,还要正确理解语言的使用方式。他们知道良好设计的重要性、面向对象编程的理论及使用现有库的最佳方式。他们还开发了大量有用的代码并了解可重用的思想。

通过阅读和理解本书的内容,你也能成为一名专业的C++程序员。你在C++方面的知识会得到扩充,将接触到鲜为人知和常被误解的语言特性。你还将领略面向对象设计,掌握卓越的调试技能。最重要的或许是,通过阅读本书,你的头脑中有了大量“可重用”思想,可将这些思想贯彻到日常工作中。

有很多好的理由让你努力成为一名专业的C++程序员,而非只是泛泛了解C++。了解语言的真正工作原理有助于提升代码质量。了解不同的编程方法论和过程可让你更好地和团队协作。探索可重用的库和常用的设计模式可提升日常工作效率,并帮助你避免白费力气去做重复的工作。所有这些学习课程都在帮助你成为更优秀的程序员,同时成为更有价值的雇员。

本书结构

本书包括6部分。

第I部分“专业的C++简介”是C++基础速成教程,能确保读者掌握C++的基础知识。在速成教程后,该部分深入讨论字符串和字符串视图的使用,因为字符串在示例中应用广泛。该部分的最后一章介绍如何编写清晰易读的C++代码。

第II部分“专业的C++软件设计”介绍C++设计方法论。你会了解设计的重要性、面向对象方法论和代码重用的重要性。

第III部分“C++编码方法”从专业角度概述C++技术。你将学习在C++中管理内存的最佳方式,如何创建可重用的类,以及如何利用重要的语言特性,例如继承。你还会学习输入输出技术、错误处理、字符串本地化和正则表达式的使用,学习如何利用模块组织可重用的代码。该部分还会讨论如何实现运算符重载,如何编写模板,如何使用概念限制模板参数,以及如何解锁lambda表达式和函数对象的功能。该部分还解释了C++标准库,包括容器、迭代器、范围和算法。在该部分你还将了解标准中提供的一些附加库,例如用于处理时间、日期、时区、随机数和文件系统的库。

第IV部分“掌握C++的高级特性”讲解如何最大限度地使用C++。该部分揭示C++中神秘的部分,并描述如何使用这些更高级的特性。在该部分你将学习如何定制和扩充标准库以满足自己的需求、高级模板编程的细节(包括模板元编程),以及如何通过多线程编程来充分利用多处理器和多核系统。

第V部分“C++软件工程”重点介绍如何编写企业级质量的软件。在这部分你将学习当今编程组织的工程实践,如何编写高效的C++代码,软件测试概念(如单元测试和回归测试),C++程序的调试技术,如何在自己的代码中融入设计技术、框架和概念性的面向对象设计模式,跨语言和跨平台代码的解决方案等。

第VI部分是四个附录。附录A列出在C++技术面试中取得成功的指南,附录B是带注解的参考文献列表,附录C总结C++标准中的头文件,附录D简要介绍UML(Unified Modeling Language,统一建模语言)(附录A~D可通过扫描封底二维码获取)。

本书没有列出C++中每个类、方法和函数的参考。Peter Van Weert和Marc Gregoire撰写的C++17 Standard Library Quick Reference是C++17标准库提供的所有重要数据结构、算法和函数的浓缩版。附录B列出了更多参考资料。下面是两个很好的在线参考资料。

cppreference.com

可使用这个在线参考资料,也可下载其离线版本,在没有连接到互联网时使用。

cplusplus.com/reference/

本书正文中提到“标准库参考资料”时,就是指上述C++参考资料。

下面是其他的优质在线资源:

github.com/isocpp/CppCoreGuidelines

《C++核心指南》由C++语言发明人Bjarne Stroustrup牵头撰写。指南的目的是帮助人们有效地使用现代C++。这些指导方针侧重于较高级别的问题,如接口、资源管理、内存管理和并发。

github.com/Microsoft/GSL

这是微软的指南支持库(GSL)的一个实现,它包含了C++核心指南使用的函数和类型。这是一个只有头文件的库。

isocpp.org/faq

这是一个频繁被提问的C++问题的庞大集合。

stackoverflow.com

可以在这里搜索常见编程问题的回答,或者提出你自己的问题。

使用本书的条件

要使用本书,只需要一台带有C++编译器的计算机。本书只关注C++中的标准部分,而没有任何编译器厂商相关的扩展。

任何C++编译器

可使用任意C++编译器。如果还没有C++编译器,可下载一个免费的。这有许多选择。例如,对于Windows,可下载Microsoft Visual Studio Community Edition,这个版本免费且包含Visual C++;对于Linux,可使用GCC或Clang,它们也是免费的。

下面将简要介绍如何使用Visual C++和GCC。可参阅相关的编译器文档了解更多信息。

编译器与C++23功能支持

本书包含C++23标准引入的新功能。在撰写本书时,还没有编译器可以完全支持C++23的所有新功能。某些新功能仅由某些编译器支持,而其他编译器不支持,而有些功能尚不受任何编译器支持。编译器厂商正在努力支持所有新功能,我相信不久就会有完全符合C++23标准的编译器可用。可以在en.cppreference.com/w/cpp/compiler_support上查看哪些编译器支持哪些功能。

编译器与C++模块支持

在撰写本书时,还没有编译器可以完全支持C++的模块。不过,所有主流编译器至少部分支持。本书在各个地方都使用了模块。如果你的编译器尚不支持模块,可以将模块代码转换为非模块代码,具体方法在第11章中有简要说明。

示例:Microsoft Visual C++ 2022

首先需要创建一个项目。启动Visual C++ 2022,在欢迎界面上,单击Create A New Project按钮。如果没有出现欢迎界面,单击File | New | Project。在Create A New Project对话框中,使用C++、Windows和Console标签,找到Console App项目模板,然后单击Next按钮。指定项目的名称、保存位置,单击Create按钮。

加载新项目后,就会在Solution Explorer中看到项目文件列表。如果这个停靠窗口不可见,可选择View | Solution Explorer。一个新创建的项目会包括一个名为.cpp的文件,就在Solution Explorer中Source Files部分的下方,可以在该文件中开始编写C++代码。如果想要编译源代码文件(扫描封底二维码获取本书源代码压缩文件),则必须在Solution Explorer中选择.cpp文件并将其删除。在Solution Explorer中右击项目名,再选择Add | New Item 或Add | Existing Item,就可以给项目添加新文件或已有文件。

在撰写本书期间,Visual C++ 2022尚未自动启用C++23功能。要启用C++23功能,可在Solution Explorer窗口中右击项目,然后单击Properties。在Properties窗口中,选择Configuration Properties | General,根据使用的Visual C++版本,将C++ Language Standard选项设置为ISO C++23 Standard或Preview | Features from the Latest C++ Working Draft,并单击OK按钮。

最后,使用Build | Build Solution编译代码。没有编译错误后,就可以使用Debug | Start Debugging运行了。

注意:

Microsoft Visual C++完全支持模块,包括 C++23 标准中的命名模块std。

示例:GCC

用自己喜欢的任意文本编辑器创建源代码,保存到一个目录下。要编译代码,可打开一个终端,运行如下命令,指定要编译的所有.cpp文件:

g++ -std=c++2b -o [source2.cpp ...]

-std=c++2b用于告诉GCC启用对C++23功能的支持。当GCC完全兼容C++23后,这个选项将改为-std=c++23。

模块支持

在 GCC 中,使用-fmodules-ts选项可以启用对模块的支持。

在撰写本书时,GCC 尚不支持 C++23 标准中引入的命名模块std(在第 1 章中介绍)。为了使这类代码能够编译,你需要将import std声明替换为单个标准库头文件的import声明。完成替换后,对于标准库头文件的import声明(例如以下内容),你需要对它们进行预编译:

import ;

这是一个预编译的示例:

g++ -std=c++2b -fmodules-ts -xc++-system-header iostream

例如,第 1 章中的 AirlineTicket 代码使用了模块。为了使用 GCC 编译它,首先将 std::println() 替换为 std::cout,因为在撰写本书时,GCC 尚不支持 功能。之后,将 import std; 声明替换为适当的 import 声明,在这个例子中是 。你可在可下载的源代码归档中的 Examples\Ch00\AirlineTicket 目录中找到已适配的代码。

接下来,编译标准库头文件

g++ -std=c++2b -fmodules-ts -xc++-system-header iostream

g++ -std=c++2b -fmodules-ts -xc++-system-header string

编译模块接口文件:

g++ -std=c++2b -fmodules-ts -c -x c++ AirlineTicket.cppm

最后,编译应用代码:

g++ -std=c++2b -fmodules-ts -o AirlineTicket AirlineTicket.cpp

AirlineTicketTest.cpp AirlineTicket.o

当其通过编译后,你可以这样运行它:

./AirlineTicket

注意:

使用 GCC 编译 C++ 代码时,采用 C++ 模块的过程可能在未来发生变化。同时,C++23 标准中的命名模块 std 将得到支持。届时,请查阅 GCC 文档,了解如何编译此类代码的更新流程。

C++23的打印范围支持

第 2 章描述了你可以轻松地将标准库容器(如 std::vector)的整个内容打印到屏幕上。这是自 C++23 引入的新特性,在撰写本书时,并非所有编译器都已支持此功能。

例如,第 2 章解释了你可以按如下方式输出 std::vector 的内容。如果你还不理解所有语法,没关系,到第 2 章结束时你就会掌握。

std::vector values { 11, 22, 33 };

std::print("{:n}", values);

这将输出:

11, 22, 33

如果你的编译器尚不支持使用 std::print() 打印容器内容的 C++23功能,你可将代码的第二行改为以下内容:

for (const auto& value : values) { std::cout

这将输出:

11, 22, 33

同样,如果你现在还不理解语法,别担心,到第 2 章结束时一切都会变得清晰。

配套下载文件

读者在学习本书中的示例时,可以手动输入所有代码,也可使用本书附带的源代码文件。然而,我建议手动输入所有代码,这对于学习和你的记忆都是有益的。本书使用的所有源代码都可以扫描封底二维码下载。

下载代码后,只需要用自己喜欢的解压缩软件进行解压缩即可。

另外,读者可扫描封底二维码,下载本书附录(附录A~D)和本书习题答案。


目录

第I部分 专业的C++简介

第1章 C++和标准库速成 3

第2章 使用字符串和字符串视图 74

第3章 编码风格 101



第II部分 专业的C++软件设计

第4章 设计专业的C++程序 123

第5章 面向对象设计 145

第6章 设计可重用代码 160


第III部分 C++编码方法

第7章 内存管理 179

第8章 熟悉类和对象 210

第9章 精通类和对象 240

第10章 揭秘继承技术 291

第11章 模块、头文件和其他主题 345

第12章 利用模板编写泛型代码 369

第13章 C++ I/O揭秘 410

第14章 错误处理 437

第15章 C++运算符重载 473

第16章 C++标准库概述 508

第17章 理解迭代器与范围库 532

第18章 标准库容器 557

第19章 函数指针、函数对象、lambda表达式 622

第20章 掌握标准库算法 647

第21章 字符串的本地化与正则表达式 680

第22章 日期和时间工具 704

第23章 随机数工具 720

第24章 其他词汇类型 729



第IV部分 掌握C++的高级特性

第25章 自定义和扩展标准库 745

第26章 高级模板 775

26.1 深入了解模板参数 775

26.1.1 深入了解模板类型参数 775

26.1.2 template template参数介绍 778

26.1.3 深入了解非类型模板参数 780

26.2 类模板部分特化 781

26.3 通过重载模拟函数部分特化 784

26.4 模板递归 785

26.4.1 N维网格:初次尝试 786

26.4.2 真正的N维网格 786

26.5 变参模板 788

26.5.1 类型安全的变长参数列表 788

26.5.2 可变数目的混入类 791

26.5.3 折叠表达式 792

26.6 模板元编程 794

26.6.1 编译期阶乘 794

26.6.2 循环展开 795

26.6.3 打印元组 795

26.6.4 类型萃取 798

26.6.5 模板元编程总结 809

26.7 本章小结 809

26.8 练习 809

第27章 C++多线程编程 810

27.1 多线程编程概述 811

27.1.1 争用条件 812

27.1.2 撕裂 813

27.1.3 死锁 813

27.1.4 伪共享 814

27.2 线程 815

27.2.1 通过函数指针创建线程 815

27.2.2 通过函数对象创建线程 816

27.2.3 通过lambda创建线程 817

27.2.4 通过成员函数指针创建线程 818

27.2.5 线程本地存储 818

27.2.6 取消线程 819

27.2.7 自动join线程 819

27.2.8 从线程获得结果 820

27.2.9 复制和重新抛出异常 821

27.3 原子操作库 823

27.3.1 原子操作 825

27.3.2 原子智能指针 826

27.3.3 原子引用 826

27.3.4 使用原子类型 826

27.3.5 等待原子变量 828

27.4 互斥 829

27.4.1 互斥量类 829

27.4.2 锁 831

27.4.3 std::call_once 834

27.4.4 互斥量的用法示例 835

27.5 条件变量 838

27.5.1 虚假唤醒 839

27.5.2 使用条件变量 839

27.6 latch 840

27.7 barrier 841

27.8 semaphore 843

27.9 future 843

27.9.1 std::promise和std::future 844

27.9.2 std::packaged_task 845

27.9.3 std::async 845

27.9.4 异常处理 846

27.9.5 std::shared_future 847

27.10 示例:多线程的Logger类 848

27.11 线程池 852

27.12 协程 852

27.13 线程设计和最佳实践 854

27.14 本章小结 855

27.15 练习 855


第V部分 C++软件工程

第28章 充分利用软件工程方法 859

28.1 过程的必要性 859

28.2 软件生命周期模型 860

28.2.1 瀑布模型 860

28.2.2 生鱼片模型 862

28.2.3 螺旋类模型 862

28.2.4 敏捷 864

28.3 软件工程方法论 865

28.3.1 Scrum 865

28.3.2 UP 867

28.3.3 RUP 868

28.3.4 极限编程 869

28.3.5 软件分流 872

28.4 构建自己的过程和方法 873

28.4.1 对新思想采取开放态度 873

28.4.2 提出新想法 873

28.4.3 知道什么行得通、什么行不通 873

28.4.4 不要逃避 873

28.5 版本控制 873

28.6 本章小结 875

28.7 练习 875

第29章 编写高效的C++程序 876

29.1 性能和效率概述 876

29.1.1 提升效率的两种方式 877

29.1.2 两种程序 877

29.1.3 C++是不是低效的语言 877

29.2 语言层次的效率 877

29.2.1 高效地操纵对象 878

29.2.2 预分配内存 881

29.2.3 使用内联函数 881

29.2.4 标记无法访问的代码 881

29.3 设计层次的效率 882

29.3.1 尽可能多地缓存 882

29.3.2 使用对象池 883

29.4 剖析 888

29.4.1 使用gprof的剖析示例 888

29.4.2 使用Visual C++ 2022的剖析示例 895

29.5 本章小结 897

29.6 练习 897

第30章 熟练掌握测试技术 898

30.1 质量控制 899

30.1.1 谁负责测试 899

30.1.2 bug的生命周期 899

30.1.3 bug跟踪工具 900

30.2 单元测试 901

30.2.1 单元测试方法 902

30.2.2 单元测试过程 902

30.2.3 实际中的单元测试 905

30.3 模糊测试 912

30.4 高级测试 913

30.4.1 集成测试 913

30.4.2 系统测试 914

30.4.3 回归测试 914

30.5 用于成功测试的建议 915

30.6 本章小结 915

30.7 练习 916

第31章 熟练掌握调试技术 917

31.1 调试的基本定律 917

31.2 bug分类学 918

31.3 避免bug 918

31.4 为bug做好规划 919

31.4.1 错误日志 919

31.4.2 调试跟踪 920

31.4.3 断言 927

31.4.4 崩溃转储 928

31.5 调试技术 928

31.5.1 重现bug 928

31.5.2 调试可重复的bug 929

31.5.3 调试不可重现的bug 929

31.5.4 调试退化 930

31.5.5 调试内存问题 930

31.5.6 调试多线程程序 934

31.5.7 调试示例:文章引用 934

31.5.8 从ArticleCitations示例中总结出的教训 945

31.6 本章小结 946

31.7 练习 946

第32章 使用设计技术和框架 948

32.1 容易忘记的语法 949

32.1.1 编写类 949

32.1.2 派生类 950

32.1.3 编写lambda表达式 951

32.1.4 使用“复制和交换”惯用语法 951

32.1.5 抛出和捕获异常 952

32.1.6 写入类模板 953

32.1.7 约束模板参数 953

32.1.8 写入文件 954

32.1.9 读取文件 954

32.2 始终存在更好的方法 955

32.2.1 RAII 955

32.2.2 双分派 958

32.2.3 混入类 961

32.3 面向对象的框架 965

32.3.1 使用框架 965

32.3.2 MVC范型 966

32.4 本章小结 967

32.5 练习 967

第33章 应用设计模式 968

33.1 策略模式 969

33.1.1 示例:日志机制 969

33.1.2 基于策略logger的实现 969

33.1.3 使用基于策略的Logger 970

33.2 抽象工厂模式 971

33.2.1 示例:模拟汽车工厂 971

33.2.2 实现抽象工厂 972

33.2.3 使用抽象工厂 973

33.3 工厂方法模式 974

33.3.1 示例:模拟第二个汽车工厂 974

33.3.2 实现工厂的方法 975

33.3.3 使用工厂方法 976

33.3.4 其他用法 978

33.4 其他工厂模式 978

33.5 适配器模式 979

33.5.1 示例:适配Logger类 979

33.5.2 实现适配器 980

33.5.3 使用适配器 981

33.6 代理模式 981

33.6.1 示例:隐藏网络连接问题 981

33.6.2 实现代理 981

33.6.3 使用代理 982

33.7 迭代器模式 983

33.8 观察者模式 983

33.8.1 示例:从主题中暴露事件 983

33.8.2 实现观察者 984

33.8.3 使用观察者 985

33.9 装饰器模式 986

33.9.1 示例:在网页中定义样式 986

33.9.2 装饰器的实现 987

33.9.3 使用装饰器 988

33.10 责任链模式 988

33.10.1 示例:事件处理 989

33.10.2 实现责任链 989

33.10.3 使用责任链 990

33.11 单例模式 991

33.11.1 日志记录机制 992

33.11.2 实现单例 992

33.11.3 使用单例 994

33.12 本章小结 994

33.13 练习 994

第34章 开发跨平台和跨语言的应用程序 996

34.1 跨平台开发 996

34.1.1 架构问题 997

34.1.2 实现问题 999

34.1.3 平台专用功能 1001

34.2 跨语言开发 1002

34.2.1 混用C和C++ 1002

34.2.2 改变范型 1002

34.2.3 链接C代码 1005

34.2.4 从C#调用C++代码 1006

34.2.5 在C++中使用C#代码及在C#中使用C++代码 1008

34.2.6 在Java中使02用JNI调用C++代码 1009

34.2.7 从C++代码调用脚本 1011

34.2.8 从脚本调用C++代码 1011

34.2.9 从C++调用汇编代码 1013

34.3 本章小结 1014

34.4 练习 1014


——以下内容可扫封底二维码下载——

第VI部分 附录

附录A C++面试 1019

附录B 参考文献及相关介绍 1039

附录C 标准库头文件 1048

附录D UML简介 1054


短评

    产品特色