C++章节目录¶
约 2828 个字 预计阅读时间 9 分钟
C语言过渡C++基础知识¶
本节首先介绍了C++中的常见关键字,但是这些关键字只是做了列举,并没有详细介绍使用,在后续的章节中会对使用到的关键字进行介绍。接着详细介绍了C++中的命名空间以及命名空间相关的注意事项、C++中使用的输入和输出方式、缺省参数的概念和使用、函数重载的概念和使用、引用的概念和使用、内联函数的概念和使用、auto
关键字的使用、基于范围的for
循环、指针空值nullptr
C++类和对象¶
本节引出类和对象的认识和概念,并对C++中如何定义类、定义类的两种方式、封装的概念、类成员访问限定符的介绍、类的作用域。除了有关类的知识外,还介绍了对象的概念、对象的大小以及this
关键字
C++默认成员函数¶
本节介绍了C++中常见的6个默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值重载函数、取地址重载函数、const修饰的取地址重载函数,针对每一个默认成员函数,本节也同时给出了相关的注意事项,为了更好地理解这些默认成员函数,本节还给出了一个日期类的实现
C++类和对象相关内容¶
本节介绍了explicit
关键字和其使用场景、static
成员、友元(包括友元函数和友元类)、内部类、匿名对象以及拷贝对象时的一些编译器优化
C++内存管理¶
本节首先介绍了C/C++内存分布,这一部分的内容与C语言动态内存管理部分是一致的,只是对这一部分的知识进行复习,在此基础之上,介绍了C++中如何进行内存管理和原理。最后,本节介绍了C语言内存管理函数malloc
和free
与C++内存管理关键字new
和delete
的对比
C++模版¶
本节开始介绍C++中的模版编程以及C++中如何使用模版,其中包括了对类模版和函数模版,另外,本节还介绍了class
关键字和typename
关键字的区别、非类型模版参数、模版的特化以及模版的分离编译
C++STL简介和string类¶
本节首先对C++的STL进行简单的介绍,接着介绍了C++中的string类的使用和注意事项,部分知识点涉及到了string的底层原理介绍,例如string底层的扩容机制
string类模拟实现¶
本节对string类进行了简单的模拟实现,在模拟实现的过程中,对string类的底层原理进行了深入的理解
vector类¶
本节介绍了C++中的vector类的使用和注意事项
vector类模拟实现¶
本节对vector类进行了简单的模拟实现,在模拟实现的过程中,对vector类的底层原理进行了深入的理解,例如深拷贝和浅拷贝问题、insert
函数与erase
函数中存在的迭代器失效问题
list类¶
本节介绍了C++中的list类的使用和注意事项,在splice
函数部分,介绍了C++中迭代器的分类
list类模拟实现¶
本节对list类进行了简单的模拟实现,在模拟实现的过程中,对list类的底层原理进行了深入的理解,尤其是迭代器的实现思路
stack类¶
本节介绍了C++中的stack类的使用和注意事项
queue类和priority_queue类¶
本节介绍了C++中的queue类priority_queue类和的使用和注意事项
stack和queue的模拟实现¶
本节对stack和queue进行了简单的模拟实现,在模拟实现的过程中,对stack和queue的底层原理进行了深入的理解,实际上,这里的模拟实现只是对容器deque进行的封装。本节同时也介绍了容器适配器的概念和deque容器
priority_queue模拟实现¶
Note
本节需要有数据结构:堆的基础
本节对priority_queue进行了简单的模拟实现,在模拟实现的过程中,对priority_queue的底层原理进行了深入的理解。本节还介绍了仿函数的概念和使用
反向迭代器设计¶
本节在原有的list迭代器设计基础之上,引出了反向迭代器的概念和设计,同样,设计基于前面的模拟实现的list类
C++继承¶
本节介绍了C++中继承的概念和语法、继承权限、父类和子类的赋值转换、继承中的作用域、子类的默认成员函数、友元与继承、静态成员与继承、单继承和多继承以及继承与组合的选择
在单继承和多继承部分,还介绍了菱形继承和虚拟继承
C++多态¶
本节首先介绍了虚函数以及虚函数重写的概念和语法,接着引出了C++多态的基本介绍,在这里还介绍了成员函数隐藏和重写的区别、override
关键字、不可继承类和不可重写函数、抽象类与多态,最后本段还介绍了接口继承和实现继承的特点和使用场景
接着,为了更好得了解多态,本节还讲解了多态的原理,其中涉及到虚函数表、动态绑定与静态绑定以及对多态的再次理解,最后本节还通过两个面试题更好得理解多态
set类¶
本节介绍了C++中的set类的使用和注意事项,在本节开始介绍容器与前面有所不同,本节开始容器的使用都会以一段代码介绍常见函数的使用,而不会对每一个接口进行单独介绍。本节最后给出了两个力扣算法题目进行练习便于更好得理解set类的应用场景
map类¶
本节介绍了C++中的map类的使用和注意事项,本节最后为了更好得理解map类,还给出了三个力扣算法题目进行练习
map和set类模拟实现¶
Note
本节需要有数据结构:红黑树的基础
本节对map和set类进行了模拟实现,参考的是SGI版本的STL中对map和set的设计
unordered_map和unordered_set类¶
Note
本节需要有数据结构:哈希表的基础
本节基于数据结构部分设计的哈希表对unordered_map和unordered_set类进行了简单的模拟实现
bitset类¶
本节介绍了C++中的bitset类的使用和注意事项
initializer_list类¶
本节介绍了C++中的initializer_list类的使用
C++11相关新特性¶
本节首先介绍了一些C++11标准更新的一些简单的新特性,其中包括原始字符串、列表初始化、decltype
关键字简单介绍、尾置返回值类型、using
和typedef
、新增的部分容器。接着重点介绍左值引用和右值引用、万能引用和完美转发、新增的两个默认成员函数、可变模版参数、lambda表达式以及包装器和绑定
在左值引用和右值引用部分,首先介绍了何为左值和右值以及何为左值引用和右值引用,在此基础之上,介绍了左值引用和右值引用的相互转换,最后引出右值引用在实际中的应用场景
在lambda表达式部分,还介绍了lambda表达式的捕获方式、for-each
函数和lambda表达式的原理
C++异常¶
本节介绍了C++中异常处理语法、异常的匹配机制、异常多次抛出问题、异常与内存泄漏问题。因为C++标准库中异常处理部分并不是特别完善,所以在实际中也会有一些自定义的异常体系,在本节也给出了一个具体的例子。最后,本节还介绍了异常的书写规范以及异常的优缺点
C++智能指针¶
本节首先介绍了何为RAII思想,接着介绍了unique_ptr
类和shared_ptr
类的使用和注意事项,为了更好得理解只能指针,尤其是shared_ptr
类,本节还对unique_ptr
类和shared_ptr
类的模拟实现进行了简单的模拟实现。接着,本节还提出了使用shared_ptr
类时会出现的循环引用问题,以此引出使用weak_ptr
类的解决方案。最后,本节对智能指针的前身auto_ptr
进行了简单的介绍、还提到了内存泄漏问题、内存泄漏的分类和如何避免内存泄漏
特殊类设计¶
本节介绍了一些特殊设计的类,包括:
- 创建一个不能被拷贝的类
- 创建一个只在堆上创建对象的类
- 创建一个只在栈上创建对象的类
- 创建一个无法被继承的父类
- 单例模式(包括饿汉和懒汉)
但是需要注意的是,本节涉及到的单例模式并不是线程安全的,如果要了解线程安全的单例模式,可以参考Linux线程池部分
C++中的类型转换¶
本节介绍了C++中存在的三种类型转换形式:
- 内置类型与内置类型之间的转换
- 内置类型与自定义类型之间的转换
- 自定义类型与自定义类型之间的转换
接着,介绍了C++中提供的四种类型转换模板函数
C++IO流¶
本节介绍了C++中IO流相关的知识,在这一节中,介绍了C++中的标准输入输出流、C++IO流的错误状态、循环读取数据的原理、输入输出流效率问题。接着,在上面的基础之上,本节还介绍了C++文件读取写入流,在这一部分介绍了文件部分存在的深浅拷贝问题。最后,本节介绍了C++标准库中的stringstream类的使用和注意事项
C++17相关新特性¶
本节介绍了C++17标准更新的一些简单的新特性,包括
- filesystem库
- string_view库
C++时间和随机数相关库¶
本节介绍了C++中与时间和随机数相关的库,包括:
- 编译时有理数算术库
<ratio>
- 时间工具库
<chrono>
- 随机数库
<random>
C++并发支持库¶
本节介绍了C++11新增的并发支持库,包括:
- 线程库
<thread>
- 互斥锁库
<mutex>
- 条件变量库
<condition_variable>
- 原子操作库
<atomic>
- 异步任务库
<future>
在原子操作库介绍部分,还提到了原子操作的原理
C++中的格式化字符串¶
本部分主要介绍了C++20提供的格式化字符串的语法和使用以及fmt库的介绍,最后对比二者的区别