既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
c++类型安全
- c++远比C更有类型安全性
- c++的一些新的机制保障类型安全:
- new返回的指针类型严格与对象匹配,而不是malloc返回的void*空类型指针
- c++提供了dynamic_cast关键字,使得转换过程更加安全
- 引入const关键字代替#define constants,有类型和作用域,而#define constants是简单的文本替换;
C++中四种类型转换方式
转换类型操作符 | 作用 |
---|---|
static_cast | 静态类型转换,类似于c的强制类型转换。包括:基本的数据类型转换,int到float等; |
const_cast | 去掉类型的const或volatile属性 |
dynamic_cast | 有条件转换,动态类型转换,运行时检查类型安全(转换失败返回NULL) 通常用于基类和子类之间的转换 |
reinterpret_cast | 仅重新解释类型,但没有进行二进制的转换,可以进行不同类型的指针转换 该转换较危险,很少使用,慎用 |
c++11的新特性
- auto : auto可以根据上下文推测变量类型 auto声明的变量必须要初始化.
auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响
- nullptr:替换NULL,避免NULL可能导致的问题 NULL在C++中代表着0,而nullptr在任何时候都代表空指针。
- 基于范围的for循环:
vector<int> v{1,2,3,4,5};
for(const auto& e : v)
cout<<e<<endl;
-
虚函数的override和final指示符
- override,表示函数应当重写基类中的虚函数
- final,表示派生类不应当重写这个虚函数
-
智能指针:为防止内存泄露等问题,用一个对象来管理野指针,使得在该对象构造时获得该指针管理权,析构时自动释放。包含在头文件中
智能指针名称 | 细节 |
---|---|
auto_ptr | 基于所有权转移。 ( 已经被c++11抛弃)缺点:一个空间不能由两个auto_ptr管理,不然会析构两次;auto_ptr的拷贝构造会将原指针的管理权交给目标指针,会使得原指针悬空。故auto_ptr会导致一些内存泄漏和野指针问题 |
unique_ptr | “唯一”拥有其所指对象,保证同一时间内只有一个智能指针可以指向该对象。有效避免资源泄露(例如“以new创建对象后因为发生异常而忘记调用delete”) 不共享它的指针,无法复制到其他unique_ptr(无拷贝构造函数),无法通过值传递到函数(无拷贝构造) |
shared_ptr | 允许多个指针可以同时指向一个对象,当最后一个shared_ptr离开作用域时,内存才会自动释放。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。注意避免循环引用,shared_ptr的一个最大的陷阱是循环引用(当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄漏) |
weak_ptr | 不增加计数,为了解决shared_ptr存在相互引用的问题,确保能够正确析构。是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象。最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。 |
- STL
容器名称 | 细节 |
---|---|
unordered_map | 采用HASH MAP实现(map内部实现了一个红黑树,故查找时间复杂度为O(logn), unordered_map通过哈希映射实现查找复杂度为O(1));如果没有顺序遍历需求采用unordered_map通常更优 |
unordered_set | 采用HASH MAP实现(set采用红黑树实现) |
array | 具有固定大小的数组。支持快速随机访问。不能添加或删除元素。array除了有传统数组支持随机访问、效率高、存储大小固定等特点外,还支持迭代器访问、获取容量、获得原始指针等高级功能 |
forward_list | 单向链表。forward_list和list的区别在于前者是单向链表,它的迭代器是前向有效的;后者是双向链表,在内部存在两个链接,它的迭代器是双向有效的。 |
malloc/free 和new/delete
- 相同点:都可用于申请动态内存和释放内存
- 区别:malloc只分配指定大小的堆内存空间,而new可以根据对象类型分配合适的堆内存空间。free释放对应的堆内存空间,delete,先执行对象的析构函数,在释放对象所占空间。malloc分配时的大小是人为计算的,返回类型是void*,使用时需要类型转换,new在分配时,编译器能够根据对象类型自动计算出大小,返回类型是指向对象类型的指针。new调用构造函数构造对象,而malloc不能;delete将调用析构函数析构对象,而free不能
程序的内存分配
- 栈区:由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等
- 堆区:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收
- 全局区(静态区static):存放全局变量、静态数据、常量。程序结束后由系统释放
- 常量区(文字常量区):存放常量字符串,程序结束后有系统释放
- 代码区:存放函数体(类成员函数和全局区)的二进制代码
内存分配方式
- 从静态存储区分配:内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
- 在栈上创建:在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数执行结束时,这些内存单元会自动被释放。栈内存分配运算内置于处理器的指令集,效率高,但是分配的内存容量有限
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**