C++学习链接

C++学习链接(PS:学习路线来自于知乎回答https://www.zhihu.com/question/23933514/answer/2283322148?utm_oi=713483502141603840)作者逐渐更新

  • 1、面向对象的三大特性:封装、继承、多态
  • 2、类的访问权限:private、protected、public
  • 3、类的构造函数、析构函数、赋值函数、拷贝函数
  • 4、移动构造函数与拷贝构造函数对比
  • 5、深拷贝与浅拷贝的区别
  • 6、空类有哪些函数?空类的大小?
  • 7、内存分区:全局区、堆区、栈区、常量区、代码区
  • 8、C++与C的区别
  • 9、struct与class的区别
  • 10、struct内存对齐
  • 11、new/delete与malloc/free的区别
  • 12、内存泄露的情况
  • 13、sizeof与strlen对比
  • 14、指针与引用的区别
  • 15、野指针产生与避免
  • 16、多态:动态多态、静态多态
  • 17、虚函数实现动态多态的原理、虚函数与纯虚函数的区别
  • 18、继承时,父类的析构函数是否为虚函数?构造函数能不能为虚函数?为什么?
  • 19、静态多态:重写、重载、模板
  • 20、static关键字:修饰局部变量、全局变量、类中成员变量、类中成员函数
  • 21、const关键字:修饰变量、指针、类对象、类中成员函数
  • 22、extern关键字:修饰全局变量
  • 23、volatile关键字:避免编译器指令优化
  • 24、四种类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
  • 25、右值引用
  • 26、std::move函数
  • 27、四种智能指针及底层实现:auto_ptr、unique_ptr、shared_ptr、weak_ptr
  • 28、shared_ptr中的循环引用怎么解决?(weak_ptr)
  • 29、vector与list比较
  • 30、vector迭代器失效的情况
  • 31、map与unordered_map对比
  • 32、set与unordered_set对比
  • 33、STL容器空间配置器

1、面向对象的三大特性:封装、继承、多态

基础概念:【C++】面向对象的三大特性:封装、继承、多态

2、类的访问权限:private、protected、public

C++ 类的访问权限public、protected、private

3、类的构造函数、析构函数、赋值函数、拷贝函数

简单介绍:【C++学习记录4】类的构造函数、析构函数、赋值函数、拷贝函数
加深理解:C++中构造函数,拷贝构造函数和赋值函数的区别和实现

4、移动构造函数与拷贝构造函数对比

【C++学习记录5】移动构造函数与拷贝构造函数对比
C++ 移动构造函数和拷贝构造函数

5、深拷贝与浅拷贝的区别

简单概念:【C++学习记录6】深拷贝与浅拷贝的区别

6、空类有哪些函数?空类的大小?

C++的空类有哪些成员函数以及类的大小组成

7、内存分区:全局区、堆区、栈区、常量区、代码区

基础概念:C++ 学习(九)内存分区(代码区、全局区、栈区、堆区)
分段和分区的不同:C/C++:内存分配,详解内存分布(P:图解及代码示例)

8、C++与C的区别

详细区别:C语言和C++的区别与联系(详细)
面试提要:C++经典面试题 | C和C++的区别是什么?

9、struct与class的区别

【C++】struct和class的区别

10、struct内存对齐

C/C++ struct字节对齐那些事儿

11、new/delete与malloc/free的区别

C++经典面试题 | malloc和new的区别?

12、内存泄露的情况

C/C++什么是内存泄露,内存泄露如何避免?

13、sizeof与strlen对比

【C++】strlen 和sizeof 的区别(小结)

14、指针与引用的区别

C++中指针与引用的区别

15、野指针产生与避免

野指针(概念,产生原因,危害,避免方法)

16、多态:动态多态、静态多态

简述概念:【C++学习记录】多态:动态多态、静态多态
更多知识:C++ —静态多态与动态多态
相关知识:【C++学习记录】特征标与重载

17、虚函数实现动态多态的原理、虚函数与纯虚函数的区别

虚函数是C++中实现多态的一种方式,它通过在基类中定义虚函数,在派生类中重写该函数,从而实现对同名函数的动态绑定。当使用基类指针或引用调用虚函数时,程序会根据指针或引用所指向的对象类型来确定调用哪个版本的虚函数,这就是动态多态的实现原理。
纯虚函数是一种特殊的虚函数,它在基类中只有声明而没有定义,其目的是为了让派生类必须重写该函数。如果一个类包含了纯虚函数,那么它就是一个抽象类,不能被实例化。

虚函数如何实现多态?虚函数底层机制是什么?
C++中的多态及实现原理(虚函数)
面试题:虚函数与纯虚函数的区别

18、继承时,父类的析构函数是否为虚函数?构造函数能不能为虚函数?为什么?

在继承时,父类的析构函数应该声明为虚函数,否则可能会导致子类的析构函数不被调用,从而可能导致子类的内存泄漏(如果子类析构函数中存在free delete 等释放内存操作时)。而构造函数不能声明为虚函数的原因是,在调用构造函数时对象还没有完成实例化,因此无法实现多态性。
简单的回答:C++类有继承时,析构函数必须为虚函数
C++:为什么在继承关系中,父类的析构函数最好定义为虚函数?

19、静态多态:重写、重载、模板

静态多态是指在编译时就能确定函数的调用地址,包括函数重载和函数模板。
函数重载是指在同一作用域内,函数名相同但参数列表不同的函数,编译器会根据参数列表的不同来区分不同的函数。而函数模板是一种通用的函数定义,可以用来创建具有多种形参类型的函数。
重写是指派生类重新定义基类中已有的虚函数,实现了基类与派生类之间的多态性。重载是指在同一作用域内,函数名相同但参数列表不同的函数,编译器会根据参数列表的不同来区分不同的函数。模板是一种通用的代码生成机制,可以用来创建具有多种形参类型或形参个数的函数或类。
多态 覆盖 重载 重写 模板 泛型

20、static关键字:修饰局部变量、全局变量、类中成员变量、类中成员函数

C/C++中static的作用(修饰局部变量、修饰全局变量、修饰函数)
static关键字在C++类中的使用

21、const关键字:修饰变量、指针、类对象、类中成员函数

具体来说,const可以用来修饰普通类型的变量、指针、类对象和类中成员函数。当const修饰普通类型的变量时,该变量的值不能被修改;当const修饰指针时,指针所指向的值不能被修改;当const修饰类对象时,表示该对象是只读的;当const修饰类中成员函数时,表示该成员函数不能对类的成员变量做修改。
C++使用const修饰对象、指针、函数、成员等
const修饰指针-视频讲解
C++ const 关键字小结

22、extern关键字:修饰全局变量

extern关键字可以用来修饰全局变量,表示该变量在其他文件中定义,本文件中只是声明。这样可以避免重复定义全局变量,同时也可以让其他文件使用该全局变量。
【重学C/C++系列(二)】:extern关键字用法全解析

23、volatile关键字:避免编译器指令优化

volatile 是 C/C++ 中的一个关键字,用于告诉编译器不要对这个变量进行优化,因为这个变量可能会被其他线程或硬件更改。如果没有使用 volatile,编译器可能会对这个变量进行优化,例如将变量缓存到寄存器中,而不是每次都从内存中读取。这可能会导致程序出现错误。
C/C++ 中的 volatile
其他知识点:
在C++中,Debug和Release的区别在于一组编译选项。Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

24、四种类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

在C++中,有四种类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast。其中,static_cast用于非多态类型之间的转换,如基本数据类型之间的转换;dynamic_cast用于多态类型之间的转换,如基类和派生类之间的转换;const_cast用于去除const属性;而reinterpret_cast则用于不同类型之间的转换,如将指针转换为整型 。
除了static_cast、dynamic_cast、const_cast、reinterpret_cast之外,还有一种类型转换:typeid。它可以返回一个类型的信息,包括类型的名称和类型的地址。

C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast)

25、右值引用

引用的基础概念:菜鸟驿站:C++ 引用
引用的相关概念和理解:【C++学习记录】为什么函数参数一般使用引用
简单易懂的左值与右值的概念:c++ 左值引用与右值引用
更多:一文读懂C++右值引用和std::move

26、std::move函数

简单理解:C++性能优化利器:std::move()
更多知识:C++11——移动构造函数及std::move() 的使用

27、四种智能指针及底层实现:auto_ptr、unique_ptr、shared_ptr、weak_ptr

C++ 标准模板库 STL(Standard Template Library)一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr。虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr。shared_ptr 和 weak_ptr 则是 C+11 从准标准库 Boost 中引入的两种智能指针。
作用

  • auto_ptr 已经被弃用,不再使用。
  • unique_ptr 是 C++11 中引入的,它是一种独占式智能指针,即不能被复制,只能通过移动来转移所有权。
  • shared_ptr 是一种共享式智能指针,可以多个指针指向同一个对象,当最后一个指向该对象的 shared_ptr 被销毁时,该对象也会被销毁。
  • weak_ptr 是一种弱引用智能指针,它不会增加所指向对象的引用计数,也就是说,它不会影响所指向对象的生命周期。
    这些智能指针都是为了解决 C++ 中的内存泄漏问题而设计的。

【c++面试之智能指针】【万字长文】【超级详细】最详细解析四种智能指针,面试题汇总及解答,妈妈再也不担心面试官考我智能指针了。

STL里的四种智能指针auto_ptr、scoped_ptr、shared_ptr、weak_ptr

28、shared_ptr中的循环引用怎么解决?(weak_ptr)

循环引用是指两个或多个对象相互引用,导致它们的引用计数都不为 0,从而无法被释放。解决这个问题的方法是使用 weak_ptr 来打破循环引用,它与一个 shared_ptr 绑定,但却不参与引用计数的计算,不论是否有 weak_ptr 指向,一旦最后一个指向对象的 shared_ptr 被销毁,对象就会被释放。
举个例子:如果 A 和 B 两个对象相互引用,那么 A 中的智能指针可以使用 weak_ptr,而 B 中的智能指针则使用 shared_ptr。这样当 A 和 B 的引用计数都为 0 时,它们所占用的内存就会被释放。
循环引用中的shared_ptr和weak_ptr

29、vector与list比较

vector 和 list 都是 C++ STL 标准模板库中的容器。它们都可以用来存储一组数据,但是它们的内部实现方式不同,因此它们的性能也有所不同。
vector 是一个封装了动态大小数组的顺序容器。它是一个连续存储的容器,在堆上分配空间。拥有一段连续的空间,并且起始地址不变。因此能高效的进行随机存取,时间复杂度为 O(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为 O(n)。
list 将元素按顺序储存在链表中。与向量 (vectors)相比,它允许快速的插入和删除,但是随机访问却比较慢。在进行插入和删除操作时,只需要改变指针指向即可,时间复杂度为 O(1);但是在进行随机存取时,需要遍历整个链表才能找到对应元素,时间复杂度为 O(n)。
总之,如果需要频繁地进行随机存取操作,那么使用 vector 会更加高效;如果需要频繁地进行插入和删除操作,那么使用 list 会更加高效。
简单概念:C++ vector和list的区别
表格对比:C++——vector和list的比较

30、vector迭代器失效的情况

vector 迭代器失效的情况有以下几种:

  • 当执行 erase 方法时,指向删除节点的迭代器全部失效,指向删除节点之后的全部迭代器也失效。
  • 当进行 push_back() 方法时,end() 操作返回的迭代器肯定失效。
  • 当进行 insert() 方法时,如果插入操作导致 vector 扩容,那么迭代器失效原因和 push_back() 相同;如果插入操作引起 vector 内元素移动,那么被移动部分的迭代器失效。

总之,在使用 vector 进行操作时,需要注意迭代器的失效问题,避免出现不可预期的错误。

31、map与unordered_map对比

map 和 unordered_map 都是 C++ STL 中的关联容器,它们的主要区别在于底层实现不同。
map 内部实现了一个红黑树,它是一种自平衡的二叉查找树,因此其元素的排列顺序是有序的。map 的查找、删除和插入操作时间复杂度均为 O(log n)。
unordered_map 内部实现了一个哈希表,通过把关键码值映射到 Hash 表中一个位置来访问记录,查找的时间复杂度可达到 O(1),其在海量数据处理中有着广泛应用。因此,其元素的排列顺序是无序的。但是,由于哈希表的建立需要消耗一定的时间,因此在小规模数据处理中,其效率不如 map。
总之,在使用 map 和 unordered_map 时,需要根据具体情况选择合适的容器。

32、set与unordered_set对比

set和unordered_set都是C++ STL中的关联式容器,它们的主要区别在于底层实现不同。set是基于红黑树实现的,因此内部所有的数据,在任何时候,都是有序的。而unordered_set则是基于哈希表实现的,数据插入和查找的时间复杂度很低,几乎是常数时间,但是代价是消耗比较多的内存,无自动排序功能。
相关知识点:
1、红黑树(Red Black Tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。
2、哈希表(Hash table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。哈希表通过哈希函数将键映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做哈希表。

33、STL容器空间配置器

在C++ STL中,空间配置器(allocator)是用来实现内存空间分配的工具,它与容器联系紧密,每一种容器的空间分配都是通过空间分配器实现的。STL容器的实现思想中,实际上将空间的分配/释放和对象的构造/析构进行了拆分:空间配置器负责空间的分配/释放;中的未初始化内存相关的函数负责对象构造/析构,移动等。

你可能感兴趣的:(C++,c++,学习)