- debug与release
debug:调试模式,包含调试信息,容量比release大很多,并且代码不会进行任何优化,便于调试。
release:发布模式,不对源代码进行调试,编译时对应用程序的速度进行优化,优化程序的代码大小和运行速度。
- C++函数后的const
非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);唯一的例外是对于mutable修饰的成员。加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用。
参考:https://www.cnblogs.com/llxblogs/p/7709509.html
- STL泛型编程
面向对象编程关注的是编程的数据方面,而STL泛型编程关注的是算法。模板使得算法独立于存储的数据类型,而迭代器使算法独立于所用的容器类型。
- C++三大特性:封装、继承、多态
封装:将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对象的使用者和设计者分开,以提高软件的可维护性和可修改性
继承:新类从已有类那里得到已有的特性,继承可以扩展已存在的代码,目的也是为了代码重用
多态:“一个接口,多种方法”
编译时的多态性:函数/操作符的重载 >>静态联编
运行时的多态性:通过派生类和虚函数实现 >>动态联编
- C++类型转换
参考:https://www.cnblogs.com/evenleee/p/10382335.html
- volatile关键字
与const对应,用来修饰变量,当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
- 数组初始化
只有在定义数组时才能初始化,不能将一个数组整体赋值给另一个数组(可分别赋值),即数组不能拷贝;
因为数组不能拷贝,所以无法以值传递的方式传递数组,函数也不能返回数组;但是可以以值传递的方式传递指针,也可以从函数返回指针;
部分初始化时,其余的值为0;
- 浅拷贝与深拷贝
浅拷贝:只拷贝指针的值,引用语义
深拷贝:重新分配内存空间,值语义
- C++空类,默认产生的成员函数
默认构造函数;拷贝构造函数;拷贝赋值运算符;析构函数;取地址运算符;取地址运算符const
- 虚函数
虚函数的作用是通过基类指针或引用调用虚函数时发生动态绑定(动态多态);
构造函数不能是虚函数,虚函数属于对象,必须先由构造函数生成对象;
静态成员函数不能是虚函数,静态函数不属于对象,不含有this指针而虚函数属于对象。
- STL六大组件
容器、算法、迭代器、仿函数、配接器、配置器
- STL容器
C++11新增:array、forward_list、unordered_set、unordered_multiset、unordered_map、unordered_multimap
序列容器:按线性序列来存储某类型值的集合,每个元素都有自己特定的位置,主要有vector、deque、list、array;
关联容器:它更注重快速高效的检索数据的能力,根据键值key来检索数据。容器中成员在初始化后都是按一定顺序 排好的,关联式容器主要有set、multiset、map、multimap;
容器适配器:对已有容器进行某些特性的再封装,它不是一个新容器,主要有stack(堆栈)、queue;
set :不能够对值修改
map:只能修改value,key不能修改。
参考:https://blog.csdn.net/ETalien_/article/details/89439892
array:固定大小的顺序容器,使用静态(栈)内存,底层数组结构同vector为数组。
list:底层数据结构为双向链表,不支持随机访问(没有“[ ]”方法),可通过迭代器访问
参考:https://zhuanlan.zhihu.com/p/33999939;https://zhuanlan.zhihu.com/p/147676383
https://www.jianshu.com/p/5446e0534b36
- 数组
用于函数头或函数原型中,int arr[ ]与int* arr含义相同,arr均为指针,表示数组的首地址;
数组名即为指针,首地址元素的指针:arr = &arr[0];
取地址运算符作用于指针时,返回整个数组的地址,即返回数组大小内存块的地址:&arr +1,加整个数组的长度;
将指针/数组名加1,实际上是加上了一个与指针指向的类型的长度(以字节为单位)相等的值:arr[i] = *(arr+i);
- 指针、引用
相同点:都能提供对其他对象的间接访问
不同点:
1) 引用并非对象,是对一个已存在的对象起的一个别名;指针本身为一个对象,允许对指针进行赋值和拷贝。
2) 引用定义必须初始化,不存在指向空值的引用;指针可不进行初始化,可指向空值(野指针)。
3) 引用初始化之后不能改变所指对象,指针可改变所指对象。
- sizeof(指针)、sizeof(引用)、sizeof(数组)
*sizeof:返回一个对象或类型所占的内存字节数
sizeof(指针):指针的大小,取决于系统位数,与所指对象没有关系
sizeof(引用):引用对象的大小
sizeof(数组):数组的大小
- sizeof(结构体)、sizeof(联合体)、sizeof(函数)、sizeof(string)、sizeof(char[ ])
sizeof(结构体):存在一个字节对齐问题;空结构体的sizeof值为1,分配一个字节空间用于占位
sizeof(联合体):联合体的内存组织形式为重叠式,各成员共享一段内存,所以值为每个成员sizeof最大值
sizeof(函数):函数返回值类型的大小,sizeof(函数名(实参表))
sizeof(string):大小是固定的,字符串所占的空间是从堆中动态分配的,与sizeof无关
sizeof(char[ ]):C风格的字符串,返回 字符数+1,多出的一个为结尾的空字符“\o”
**string可直接由另一string赋值,char不可以,均以空字符串“\o"结尾
https://www.cnblogs.com/huolong-blog/p/7587711.html
- sizeof、strlen
strlen:常规函数,接受一个C-风格字符串作为参数,并返回该字符串包含的字符数
- 数组退化
在C++中,数组不会按值传递,而是传递第0个元素的指针(首地址),数组退化为指针。
数组不退化为指针的情况:
https://blog.csdn.net/PleasantlY1/article/details/81668308
- 内存对齐
https://zhuanlan.zhihu.com/p/30007037
- 用户态、内核态
用户态:用户应用进程使用的地址空间
内核态:Linux内核的地址空间
空间切换:当执行系统调用函数时,会发生CPU上下文切换,即用户空间与内核空间的切换
- 原子操作
一个或多个操作步骤,一旦执行,不能够被打断。