具体描述
编辑推荐
《新标准C++程序设计/北京大学“程序设计与算法”专项课程系列教材》特色:
本书为北京大学“程序设计与算法”专项课程系列教材之一。教材内容与MOOC课程同步。
本书紧扣新的C++11标准,全面讲述C++面向对象的各种特性,覆盖标准模板库90%以上的内容,读者通过本书可较全面掌握C++程序设计的精髓。
本书作者具有丰富的C++教学经验和数十万行商业软件开发经验,书中所有样例程序均由作者精心设计,程序风格优美,贴近编程实践。
内容简介
《新标准C++程序设计/北京大学“程序设计与算法”专项课程系列教材》是北京大学“程序设计与算法”专项课程系列教材之一。
《新标准C++程序设计/北京大学“程序设计与算法”专项课程系列教材》面向掌握C语言后希望继续学习C++面向对象编程的读者,不包含C++语言中与C语言相同的部分。除了讲授C++面向对象的各种特性外,还强调泛型程序设计的方法以及标准模板库STL的应用。作者有多年高校教学经验,写作时就已经将容易使学生困惑的问题的解答融入其中,用简练的语言直指问题的重点、难点和本质。作者曾开发多款成功的商业软件,因此本书对语言特性的讲解与实践紧密结合,程序实例丰富实用,风格优美。程序员与教师兼具的写作视角,造就了本书的与众不同。书名中的“新标准”有两层含义:一是指本书的所有讲述和程序都严格遵循C++新标准;二是指读者通过本书的学习,对C++语言的掌握程度能够达到专业程序员的高标准。
《新标准C++程序设计/北京大学“程序设计与算法”专项课程系列教材》可作为高等学校计算机及相关专业C++程序设计课程的教材,也可供对C++程序设计感兴趣的读者自学使用。
作者简介
郭炜,本科毕业于中国科学技术大学计算机系,硕士毕业于北京大学计算机科学技术系,现为北京大学信息科学技术学院教师。担任北京大学ACM国际大学生程序设计竞赛队教练12年,从2008年至今,为ACM国际大学生程序设计竞赛亚洲区赛站命题十余场。北京角斗士软件技术有限公司创始人,开发《我爱背单词》等多款成功的商业软件。兼具丰富的教学经验和软件开发实践经验。
内页插图
目录
第一篇 面向对象的程序设计
第1章 从C到C++
1.1 C++语言的历史
1.2 输入输出
1.3 头文件
1.4 强制类型转换运算符的新形式
1.5 函数参数的默认值
1.6 引用和函数参数的传递
1.7 内联函数
1.8 函数的重载
1.9 指针和动态内存分配
1.1 0用string对象处理字符串
小结
习题
第2章 类和对象初步
2.1 结构化程序设计的不足
2.2 面向对象程序设计的概念和特点
2.3 类的定义和使用
2.4 类的示例程序剖析
2.5 访问对象的成员
2.6 类成员的可访问范围
小结
习题
第3章 类和对象进阶
3.1 构造函数
3.2 析构函数
3.3 构造函数、析构函数和变量的生存期
3.4 静态成员变量和静态成员函数
3.5 常量对象和常量成员函数
3.6 成员对象和封闭类
3.7 const成员和引用成员
3.8 友元
3.9 this指针
3.1 0在多个文件中使用类
小结
习题
第4章 运算符重载
4.1 运算符重载的概念和原理
4.2 重载赋值运算符“=”
4.3 浅拷贝和深拷贝
4.4 运算符重载为友元函数
4.5 实例:长度可变的整型数组类
4.6 重载流插入运算符和流提取运算符
4.7 重载类型强制转换运算符
4.8 重载自增、自减运算符
4.9 运算符重载的注意事项
小结
习题
第5章 继承与派生
5.1 继承和派生的概念
5.2 正确处理类的复合关系和继承关系
5.3 pmtected访问范围说明符
5.4 派生类的构造函数和析构函数
5.5 多层次的派生
5.6 包含成员对象的派生类
5.7 公有派生的赋值兼容规则
5.8 基类与派生类指针的互相转换
5.9 私有派生和保护派生
5.10 派生类和赋值运算符
小结
习题
第6章 多态与虚函数
6.1 多态的基本概念
6.2 多态的作用
6.3 多态的实现原理
6.4 关于多态的注意事项
6.5 虚析构函数
6.6 纯虚函数和抽象类
小结
习题
第7章 输入输出流
7.1 流类
7.2 标准流对象
7.3 使用流操纵算子控制输出格式
7.4 调用cout的成员函数
7.5 cin的高级用法
小结
习题
第8章 文件操作
8.1 文件的概念
8.2 C++文件流类
8.3 文件的打开和关闭
8.4 文件的读写
8.5 文本方式打开文件与二进制方式打开文件的区别
小结
习题
第二篇 泛型程序设计
第9章 泛型程序设计与模板
9.1 函数模板
9.2 类模板
9.3 类模板中的非类型参数
9.4 类模板与继承
9.5 类模板和友元
9.6 类模板中的静态成员
9.7 在多个文件中使用模板
小结
习题
第10章 标准模板库STL
10.1 STL中的基本概念
10.2 顺序容器
10.3 函数对象
10.4 关联容器
10.5 容器适配器
10.6 STL算法分类
10.7 不变序列算法
10.8 变值算法
10.9 删除算法
10.10 变序算法
10.11 排序算法
10.12 有序区间算法
10.13 string类详解
10.14 bitset对象
小结
习题
第三篇 C++高级主题
第11章 C++高级主题
11.1 static-cast、reinterpret-cast、const-cast和dynamic-cast
11.2 C++异常处理
11.3 C++11新特性概要
小结
习题
附录:魔兽世界大作业
参考文献
前言/序言
一、本书的写作背景
C++功能强大、运用广泛,许多高校都将其作为入门的程序设计语言进行教学。作者在北京大学信息科学技术学院讲授C++程序设计课程已有14年,随着时间的推移,渐渐觉得现有的教材已经不能满足教学的需要,于是萌生了自己编写一本C++教材的想法。
C++有两大特点:支持面向对象的程序设计和支持泛型程序设计。然而,现有的大部分教材往往对“泛型程序设计”这部分内容基本不做介绍,或只是略作交代。这导致许多学过或准备学C++的学生有如下印象:C++是为了编写大型程序而设计的,如果编写一个只有十几行或几十行的小程序,没有必要用C++,用C语言就足够了。实际上,编写规模很小的程序用面向对象的设计方法确无必要,但不等于用C++没必要。C++中的标准模板库(STL)是泛型程序设计的最成功应用,其中包含许多常用的数据结构(如动态数组、栈等)和算法(如排序、二分查找等),STL即便应用于只有十几行代码的程序中,也能有效地提高编程效率。对于熟练的C++程序员来说,编写只有十几行代码的程序多半不会考虑使用面向对象的设计方法,但会很自然地用到STL。C++标准委员会成员AndrewKoenig有句名言:“库设计就是语言设计,语言设计就是库设计”。学了C++语言,却不会用该语言的核心库STL,对于计算机专业的学生来说,这样的教学很难说是成功的。
国内大多数的C++教材对泛型程序设计和STL讲述甚少,国外虽有几部经典教材,全面覆盖了C++的两大特点,但又都卷帙浩繁,动辄近千页,不适合初学者。为了解决这个矛盾,作者编写了本书。本书篇幅适中,全面讲述C++面向对象的各种特性,此外还覆盖标准模板库90%以上的内容。初学者通过对本书的学习,可以比较全面地掌握C++程序设计语言的精髓。
《精通 C++:从基础到实践,驾驭现代软件开发》 内容简介: 本书旨在为广大 C++ 爱好者、初学者以及希望深化 C++ 理解的开发者提供一份全面而深入的指南。我们不仅仅关注 C++ 语言本身,更致力于帮助读者掌握使用 C++ 进行高效、可靠软件开发的现代方法论和设计原则。从最基本的语法概念,到复杂的面向对象编程、泛型编程、并发编程,再到现代 C++ 标准引入的强大特性,本书层层递进,力求让读者在掌握语言工具的同时,培养出解决实际问题的编程思维。 第一部分:C++ 语言基石与现代开发实践 本部分将带领读者从零开始,构建坚实的 C++ 编程基础。我们将深入探讨 C++ 的核心概念,并结合现代 C++ 的最佳实践,让读者在学习语言的同时,就能培养出良好的编程习惯。 章节一:编程世界初探与 C++ 环境搭建 理解编程的本质,程序是如何工作的。 介绍 C++ 语言的历史、特点及其在软件开发中的地位。 详细指导读者在不同操作系统(Windows, macOS, Linux)上安装和配置 C++ 开发环境,包括编译器(如 GCC, Clang, MSVC)和集成开发环境(IDE,如 Visual Studio Code, CLion, Visual Studio)。 编写并运行第一个 C++ 程序“Hello, World!”,理解编译、链接和运行的完整流程。 学习基本的代码编辑、调试技巧,以及如何阅读和理解编译器给出的错误信息。 章节二:变量、数据类型与基本运算 深入理解 C++ 中各种基本数据类型(整数类型 `int`, `long`, `short`,浮点类型 `float`, `double`,字符类型 `char`,布尔类型 `bool`)的内存表示、取值范围和使用场景。 学习如何声明和初始化变量,理解变量的生命周期和作用域。 掌握算术运算符(`+`, `-`, ``, `/`, `%`)、关系运算符(`==`, `!=`, `<`, `>`, `<=`, `>=`)、逻辑运算符(`&&`, `||`, `!`)和位运算符。 理解运算符的优先级和结合性,以及如何使用括号改变运算顺序。 学习类型转换(隐式转换和显式转换),以及可能带来的问题。 引入常量(`const`)的概念,强调其在提高代码可读性和安全性中的作用。 章节三:控制流:让程序拥有决策与循环的能力 学习条件语句 `if`, `else if`, `else`,实现程序的选择性执行。 掌握多分支选择语句 `switch`,适用于多个固定值的判断。 深入理解循环结构:`while` 循环(先判断后执行),`do-while` 循环(先执行后判断),以及 `for` 循环(适用于已知循环次数的情况)。 学习如何使用 `break` 和 `continue` 语句控制循环的流程。 讲解嵌套循环的应用,以及如何处理复杂的逻辑。 强调在编写控制流代码时,保持清晰的逻辑和避免无限循环的重要性。 章节四:函数:代码复用与模块化设计 理解函数的作用:代码的封装、复用和模块化。 学习函数的定义、声明(原型)和调用。 掌握函数参数的传递方式:传值(pass-by-value)和传引用(pass-by-reference)。 深入理解引用(`&`)的概念及其在函数参数和变量赋值中的强大应用。 讲解函数的返回值,以及如何返回复杂类型。 学习函数重载(function overloading),允许在同一作用域内定义同名但参数列表不同的函数。 介绍内联函数(`inline`)的概念,以及其对性能的潜在影响。 学习递归函数(recursive function)的概念和应用,理解其工作原理和注意事项。 强调函数命名规范、参数设计和返回值设计的原则,以编写清晰易懂的函数。 章节五:数组与字符串:组织和处理序列化数据 学习一维数组和多维数组的声明、初始化和访问。 理解数组的内存布局和下标访问。 掌握 C 风格字符串(以 null 字符 `' '` 结尾的字符数组)及其常用操作函数(如 `strlen`, `strcpy`, `strcat`, `strcmp`)。 引入 C++ 标准库提供的 `std::string` 类,学习其丰富的成员函数,如拼接、查找、替换、子串提取等,以及其内存管理优势。 讨论数组与指针的关系,以及通过指针操作数组的技巧。 讲解数组越界访问的危险性,并提出防范措施。 第二部分:面向对象编程(OOP)的核心与实践 本部分将带领读者进入 C++ 面向对象编程的殿堂,掌握如何设计和构建可维护、可扩展的软件系统。 章节六:类与对象:封装、继承与多态的基石 理解面向对象编程(OOP)的基本思想:将数据和操作数据的方法封装在一起。 学习如何定义类(`class`),包括访问修饰符(`public`, `private`, `protected`)的使用。 掌握类的成员(数据成员和成员函数)的定义与访问。 理解对象的创建(实例化)和销毁。 深入讲解构造函数(constructor)和析构函数(destructor)的作用,以及它们在对象生命周期管理中的重要性。 学习成员初始化列表,以及其在初始化常量成员和基类成员中的应用。 理解 `this` 指针,指向当前对象。 学习静态成员(`static`)的概念,包括静态数据成员和静态成员函数,以及它们的应用场景。 章节七:继承:代码的重用与层级结构 理解继承(inheritance)的概念,允许一个类(派生类)继承另一个类(基类)的属性和行为。 学习不同类型的继承:公有继承(`public`)、保护继承(`protected`)、私有继承(`private`)。 掌握派生类的构造函数和析构函数的调用顺序。 理解虚函数(virtual function)的概念,以及它在实现多态性中的关键作用。 学习抽象类(abstract class)和纯虚函数(pure virtual function),它们定义了接口,但不能被实例化。 讲解多重继承(multiple inheritance)的特性和潜在的菱形问题,以及如何避免。 章节八:多态:动态绑定与灵活的程序设计 深入理解多态(polymorphism)的定义和重要性。 学习运行时多态(runtime polymorphism),通过虚函数实现。 掌握向上转型(upcasting)和向下转型(downcasting)。 理解动态绑定(dynamic binding)和静态绑定(static binding)的区别。 学习使用指针和引用操作派生类对象,并调用基类中的虚函数,从而实现多态行为。 讨论多态在设计模式(如工厂模式、策略模式)中的广泛应用。 讲解如何使用 `dynamic_cast` 和 `static_cast` 进行安全的类型转换。 章节九:运算符重载与拷贝控制 学习如何为自定义类重载各种运算符(如算术运算符、关系运算符、输入/输出运算符 `<<` 和 `>>`),使自定义类型的使用更直观。 深入理解拷贝构造函数(copy constructor)和拷贝赋值运算符(copy assignment operator)的作用,以及它们在创建对象副本时的机制。 掌握深拷贝(deep copy)与浅拷贝(shallow copy)的区别,以及何时需要实现深拷贝。 学习移动构造函数(move constructor)和移动赋值运算符(move assignment operator),利用 C++11 引入的右值引用(rvalue reference)和移动语义,显著提升资源管理和对象复制的性能。 理解前置与后置的自增/自减运算符重载的区别。 第三部分:泛型编程、STL 与现代 C++ 特性 本部分将带领读者探索 C++ 强大的模板机制和标准库,以及现代 C++ 标准引入的革新性特性,助您编写出更高效、更优雅的代码。 章节十:模板:编写通用的代码 理解泛型编程(generic programming)的思想,编写与类型无关的代码。 学习函数模板(function template)的定义和使用,实现通用算法。 掌握类模板(class template)的定义和实例化,创建通用数据结构。 理解模板的特化(template specialization),为特定类型提供定制实现。 学习模板的参数推导(template argument deduction)规则。 讨论模板在减少代码冗余和提高代码通用性方面的优势。 章节十一:STL(Standard Template Library):高效的工具箱 介绍 STL 的核心组成部分:容器(containers)、算法(algorithms)和迭代器(iterators)。 容器: 序列容器:`std::vector` (动态数组), `std::list` (双向链表), `std::deque` (双端队列)。 关联容器:`std::set` (有序集合), `std::map` (有序键值对), `std::unordered_set` (哈希集合), `std::unordered_map` (哈希键值对)。 容器适配器:`std::stack`, `std::queue`, `std::priority_queue`。 迭代器: 理解迭代器作为访问容器元素的通用接口,以及不同类型的迭代器。 算法: 学习 STL 提供的各种通用算法,如排序 (`std::sort`)、查找 (`std::find`)、遍历 (`std::for_each`)、计数 (`std::count`)、复制 (`std::copy`) 等。 STL 的优势: 提高开发效率,减少错误,提供高效的实现。 章节十二:异常处理与错误管理 理解异常(exception)的概念,用于处理程序运行时发生的非正常情况。 学习 `try`, `catch`, `throw` 关键字的使用,实现结构化的异常处理。 掌握如何捕获特定类型的异常,以及如何捕获所有异常。 学习标准异常类(如 `std::runtime_error`, `std::logic_error`)的使用。 讨论异常处理的性能开销和最佳实践。 介绍断言(`assert`)在开发调试阶段的应用。 章节十三:内存管理与智能指针 深入理解 C++ 中的内存模型:栈(stack)和堆(heap)。 掌握动态内存分配:`new` 和 `delete` 运算符。 强调手动管理内存的风险:内存泄漏(memory leak)和野指针(dangling pointer)。 引入智能指针(smart pointers)的概念,自动管理动态分配的内存。 重点介绍 `std::unique_ptr`(独占所有权), `std::shared_ptr`(共享所有权)和 `std::weak_ptr`(弱引用)的用法和区别。 理解 RAII(Resource Acquisition Is Initialization)原则在资源管理中的重要性。 章节十四:现代 C++ 特性(C++11/14/17/20) C++11: `auto` 类型推导:简化变量声明。 范围 `for` 循环(range-based for loop):更简洁的遍历方式。 Lambda 表达式:匿名函数,方便创建局部函数对象。 右值引用与移动语义:提升性能。 `nullptr`:取代 `NULL`。 `constexpr`:编译期计算。 C++14/17/20: 模板参数推导的改进。 结构化绑定(structured bindings):方便解构元组、结构体等。 `if constexpr`:编译期条件分支。 并行 STL 算法:提升大数据处理性能。 Concepts (C++20):用于约束模板参数。 Modules (C++20):改进代码组织和编译速度。 鼓励读者在实际项目中使用这些现代特性,提升代码质量和效率。 第四部分:进阶主题与项目实践 本部分将触及更高级的 C++ 主题,并通过实际案例展示如何将所学知识应用于解决复杂的工程问题。 章节十五:文件 I/O 操作 学习使用 C++ 标准库中的 `fstream` 类(`ifstream`, `ofstream`, `fstream`)进行文本文件和二进制文件的读写。 掌握打开、关闭文件,读写数据,以及文件模式(如 `ios::in`, `ios::out`, `ios::app`, `ios::binary`)。 讲解文件流的状态检查(如 `good()`, `eof()`, `fail()`, `bad()`)。 通过实际例子演示如何读取配置文件、保存程序状态等。 章节十六:并发编程基础 介绍多线程(multi-threading)的概念,以及 C++11 引入的 `std::thread`。 学习线程的创建、启动、 join 和 detach。 理解线程同步问题(race condition)以及互斥锁(mutex,`std::mutex`)和条件变量(condition variable,`std::condition_variable`)的应用。 介绍原子操作(atomic operations)的概念。 为读者打开通往并行计算和高性能计算的大门。 章节十七:设计模式入门 介绍几种常用的设计模式,如工厂模式(Factory Pattern)、单例模式(Singleton Pattern)、观察者模式(Observer Pattern)等。 讲解设计模式的意图、结构和优缺点。 通过 C++ 代码示例展示如何应用这些模式来解决常见的软件设计问题,提升代码的可维护性和可扩展性。 章节十八:构建实际 C++ 项目 从需求分析到代码实现,指导读者完成一个或多个具有代表性的 C++ 项目。 项目可能包括:一个简单的命令行工具、一个文本编辑器、一个小型图形界面应用(使用第三方库如 Qt 或 wxWidgets)、一个数据处理程序等。 强调在项目开发过程中,如何应用之前章节中学到的所有知识点,包括面向对象设计、STL、异常处理、内存管理等。 鼓励读者进行代码重构、单元测试和性能优化。 总结: 本书力求提供一条系统化的 C++ 学习路径,从最基础的语法元素,逐步深入到高级概念和现代 C++ 的强大特性。我们坚信,掌握 C++ 不仅是学习一门语言,更是掌握一种严谨的思维方式和强大的工具。通过本书的学习,读者将能够独立设计、开发和维护复杂的 C++ 应用程序,为在软件开发领域取得成功奠定坚实的基础。