跳转至

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语言内存管理函数mallocfree与C++内存管理关键字newdelete的对比

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关键字简单介绍、尾置返回值类型、usingtypedef、新增的部分容器。接着重点介绍左值引用和右值引用、万能引用和完美转发、新增的两个默认成员函数、可变模版参数、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进行了简单的介绍、还提到了内存泄漏问题、内存泄漏的分类和如何避免内存泄漏

特殊类设计

本节介绍了一些特殊设计的类,包括:

  1. 创建一个不能被拷贝的类
  2. 创建一个只在堆上创建对象的类
  3. 创建一个只在栈上创建对象的类
  4. 创建一个无法被继承的父类
  5. 单例模式(包括饿汉和懒汉)

但是需要注意的是,本节涉及到的单例模式并不是线程安全的,如果要了解线程安全的单例模式,可以参考Linux线程池部分

C++中的类型转换

本节介绍了C++中存在的三种类型转换形式:

  1. 内置类型与内置类型之间的转换
  2. 内置类型与自定义类型之间的转换
  3. 自定义类型与自定义类型之间的转换

接着,介绍了C++中提供的四种类型转换模板函数

C++IO流

本节介绍了C++中IO流相关的知识,在这一节中,介绍了C++中的标准输入输出流、C++IO流的错误状态、循环读取数据的原理、输入输出流效率问题。接着,在上面的基础之上,本节还介绍了C++文件读取写入流,在这一部分介绍了文件部分存在的深浅拷贝问题。最后,本节介绍了C++标准库中的stringstream类的使用和注意事项

C++17相关新特性

本节介绍了C++17标准更新的一些简单的新特性,包括

  1. filesystem库
  2. string_view库

C++时间和随机数相关库

本节介绍了C++中与时间和随机数相关的库,包括:

  1. 编译时有理数算术库<ratio>
  2. 时间工具库<chrono>
  3. 随机数库<random>

C++并发支持库

本节介绍了C++11新增的并发支持库,包括:

  1. 线程库<thread>
  2. 互斥锁库<mutex>
  3. 条件变量库<condition_variable>
  4. 原子操作库<atomic>
  5. 异步任务库<future>

在原子操作库介绍部分,还提到了原子操作的原理

C++中的格式化字符串

本部分主要介绍了C++20提供的格式化字符串的语法和使用以及fmt库的介绍,最后对比二者的区别