链接中的内容不一定就是对的,谨慎思考
学长的c++复习总结:https://www.yuque.com/xihuankanxuelianhui/blfh9c/ugealw
业内前辈的总结:https://github.com/CyC2018/CS-Notes (经典好用)
推荐网站:c语言中文网,菜鸟教程
一、语法基础
1.指针和引用
https://blog.csdn.net/K346K346/article/details/46805159
2.指针和内存
https://blog.csdn.net/zhaocuit/article/details/74331961
3.程序编译过程
预处理-编译-汇编-链接
https://www.yuque.com/xihuankanxuelianhui/blfh9c/ugealw#b7UZO
https://github.com/CyC2018/CS-Notes 计算机操作系统-链接(解释得很详细)
4.static、const、#define的用法和区别
define:https://blog.csdn.net/xianqianshi3004/article/details/79278170 (define语句的处理是在预处理时期进行的,typedef是在编译时被处理的)
static:注意全局变量,局部变量,类成员不一样
const:用于变量修饰,表明这个变量不能被修改;用于指针修饰,表明指针的指向物不能被修改;用于方法修饰,表明这个方法不会对对象造成改变。
https://www.zhihu.com/question/29307292 Xi Yang
https://www.cnblogs.com/dong008259/archive/2011/11/16/2251430.html
https://zhuanlan.zhihu.com/p/141113043
5.C和C++区别
很大的一个问题,自己发挥吧,可以从语言特性,使用场景,设计哲学这些方向作答
https://www.zhihu.com/question/28834538
具体的不同点列举出来:
https://blog.csdn.net/czc1997/article/details/81254971
https://www.cnblogs.com/ITziyuan/p/9487760.html
https://blog.csdn.net/tonglin12138/article/details/94555183
6.内存模型
在了解内存模型之前,先了解缓冲区溢出与内存泄漏问题
缓冲区溢出会造成严重的安全问题
https://blog.csdn.net/u013696062/article/details/25078505
https://www.cnblogs.com/fanzhidongyzby/archive/2013/08/10/3250405.html
https://www.169it.com/tech-qa-linux/article-1378588262148105222.html
内存泄露问题
https://www.cnblogs.com/zzdbullet/p/10478744.html
https://blog.csdn.net/Rocketcp3/article/details/104266984
思考:为何重载赋值运算符时需要将旧对象的内存释放掉然后开辟新的内存?不仔细想会觉得直接赋值不就好了吗,为什么需要释放掉重新开辟?若新对象成员中存在指针,直接赋值就是将同一个地址给了旧对象成员,此时赋值的成员与被赋值的成员均指向同一块地址,当对象a调用析构函数释放内存的时候,另对象b成员所指向的同一块地址也被释放,第一是造成野指针问题,第二是对象b调用析构函数会造成二次释放内存的问题,即内存泄漏问题。
c++全局常量与局部常量
https://blog.de3eb.cn/2014/02/difference_between_global_and_local_const/
弄清楚普通继承的虚表指针与虚函数表,以及虚继承的虚基类表指针,虚基类表
虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。虚基类表中所存储的数据是虚基类表指针到被继承的虚基类之间的偏移
https://www.cnblogs.com/smallredness/p/11022155.html
https://blog.csdn.net/longlovefilm/article/details/80558879
https://www.cnblogs.com/yunlambert/p/9876491.html
http://c.biancheng.net/view/2280.html
使用new分配的内存在自由存储区里面,与堆有区别,普通的new一般是分配堆中的内存,但new还可以使用栈里面的内存
https://fishc.com.cn/thread-124648-1-1.html
多处理器编程的内存模型,实现并发操作共享内存的正确性
https://zhuanlan.zhihu.com/p/103425537?utm_source=wechat_timeline
https://www.codedump.info/post/20191214-cxx11-memory-model-1/#cpu架构的演进
https://www.codedump.info/post/20191214-cxx11-memory-model-2/
https://zhuanlan.zhihu.com/p/45024624
7.内存中的栈和堆分配
https://blog.csdn.net/u013007900/article/details/79338653
栈的动态分配alloca
https://blog.csdn.net/masefee/article/details/6835688
内存泄漏、内存溢出、内存越界、缓冲区溢出、栈溢出、
缓冲与内存的区别(buffer与memory)
缓冲与缓存的区别(buffer与cache)
二、面向对象基础
面向对象理解
https://blog.csdn.net/melody_1016/article/details/54915131
若编译器对返回值与传入值做优化,那么这些对象到底是存在哪里?
析构函数
构造函数
拷贝构造
https://www.cnblogs.com/liushui-sky/p/7728902.html
多态
纯虚函数和虚函数
虚函数实现机制
虚函数表
访问限定符 public、private、protected
继承原理、虚继承、菱形继承
没有重写虚函数的向上转型:通过基类访问派生类成员,编译器通过指针来访问成员变量,指针指向哪个对象就使用哪个对象的数据;编译器通过指针的类型来访问成员函数,指针属于哪个类的类型就使用哪个类的函数。向上转型后通过基类的对象、指针、引用只能访问从基类继承过去的成员(包括成员变量和成员函数),不能访问派生类新增的成员。
重写虚函数的向上转型:触发多态,此时编译器访问成员函数就是通过虚函数表进行查找,不在根据指针类型进行相应成员函数的访问
为何输入输出流需要设置为引用才能实现连续赋值?和右值引用有关
静态绑定和动态绑定
new/delete和malloc/free
重载、重写和隐藏
https://www.cnblogs.com/sunshine-free/p/13817500.html
三、语法进阶
智能指针
https://www.cnblogs.com/wuyepeng/p/9741241.html
智能指针的循环引用
https://blog.csdn.net/love18792838953/article/details/78393509
类型萃取type_trait
https://blog.csdn.net/timecur/article/details/97640167
https://www.cnblogs.com/Forever-Kenlen-Ja/p/7074228.html
std::array<int, 3>是一个类型,并不是数组
https://blog.csdn.net/thinkerleo1997/article/details/80415059
size_t
https://blog.csdn.net/yas12345678/article/details/52424963
lambda表达式
https://blog.csdn.net/NietzscheI/article/details/102902862
左值、右值引用和move语义
https://blog.csdn.net/weixin_42570248/article/details/100748302
remove_reference引用移除
https://www.cnblogs.com/creativityroom/p/6891772.html
底层const与顶层const
https://blog.csdn.net/qq_19528953/article/details/50922303
const_cast
https://blog.csdn.net/TanJiaLiang_/article/details/83992337
std::move()
https://blog.csdn.net/p942005405/article/details/84644069/
针对++的连续操作,对++的运算符重载返回引用才能得到期望的结果
https://www.zhihu.com/question/39530632?sort=created
连续赋值与赋值运算符重载问题
c++支持连续赋值,针对连续赋值操作,赋值运算符重载不返回引用也可以得到正确的结果,但是使用引用能提高效率
https://blog.csdn.net/murongjianke001/article/details/39151419?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf
https://www.cnblogs.com/zpcdbky/p/5027481.html
类型转换方式
https://blog.csdn.net/ydar95/article/details/69822540
常用的设计模式与线程安全的单例模式
注意单例模式中的双重校验锁保证线程安全
https://www.cnblogs.com/chengjundu/p/8473564.html
https://blog.csdn.net/hechao3225/article/details/71366058
https://github.com/CyC2018/CS-Notes/blob/master/notes/设计模式 - 单例.md
内存溢出和内存泄漏
C++11新特性
静态链接库和动态链接库
https://www.cnblogs.com/52php/p/5681711.html
https://www.cnblogs.com/ganxiang/p/13206704.html
https://blog.csdn.net/u011913417/article/details/101209715
c++内存池实现
STL中的内存分配器allocator
https://blog.csdn.net/fengbingchun/article/details/78943527/
https://blog.csdn.net/md521/article/details/42046043
https://zhuanlan.zhihu.com/p/34725232
dlmalloc:
https://blog.csdn.net/vector03/article/details/40979181
https://blog.csdn.net/ycnian/article/details/13000927
https://blog.csdn.net/txx_683/article/details/53457055
SGI ATL allocator
https://blog.csdn.net/cyningsun/article/details/6225563
https://blog.csdn.net/md521/article/details/42046043
空闲链表与内存池的关系
https://zhuanlan.zhihu.com/p/73468738
c++ set_new_handler
https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/4209879.html
placement new
https://blog.csdn.net/linuxheik/article/details/80449059
序列化与反序列化
https://www.cnblogs.com/Malphite/p/10818954.html
反射
https://blog.csdn.net/qq_22660775/article/details/89713867
条件变量
https://www.cnblogs.com/chenyunf22/p/12775357.html
C/C++ Linux服务器架构师:C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg
-
this指针
- this实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给this。this这个形参是隐式的,并不出现在代码中,而是在编译阶段由编译器将其添加到参数列表中。
- this作为隐式形参,本质上是成员函数的局部变量,所以只能在成员函数的内部,并且只有通过对象调用成员函数的时候才会给this赋值。
- 成员函数最终会被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以编译时需要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数与成员变量,这个额外的参数就是this,它是成员变量与成员函数之间关联的桥梁。
- 注意:
- this是const指针,它的值不能被修改,一切企图该指针的操作,如赋值,递增,递减等都是不被允许的
- this只能在成员函数内部使用,在其他地方使用没有意义,也是非法的
- 只有当对象被创建之后this才有意义,所以不能在static成员函数中使用
-
静态成员变量
使用静态成员变量实现多个对象共享数据,用static关键字修饰
static成员变量必需在类声明的外部初始化,static成员的变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在类外初始化时分配,反过来说,没有在类外初始化的static成员变量不能使用。static成员变量存储在全局数据区的静态存储区 -
c++11新特性 magic static使用局部静态变量的方法实现线程安全的懒汉模式
- 私有构造函数;静态公有成员函数让外部获得实例;公有函数中定义一个当前类的静态实例
- 局部静态变量可以延迟对象的构造
- magic static特性:静态变量的初始化是线程安全的。当一个static变量初始化时,若有其他并发线程进入到这个声明语句,则并发线程将会阻塞等待初始化结束,保证并发线程在获取静态局部变量的时候一定是初始化过的,具有线程安全性。