1.union共同体和struct结构体的区别
- struct和union都是由多个不同的数据类型成员组成
- 同一时刻,union只存放了一个数据成员,而struct的所有成员都存在
- 在struct中,每个成员都有自己的内存,它们同时存在,在union中,所有成员不能同时占用各自的一块内存,因此不能同时存在,只能存在一个
- struct的长度为所有成员长度之和,union的长度为最长成员的长度
- 对union不同成员赋值会重写其他成员,而struct的不同成员之间的赋值互不影响
2.static的作用
- 修饰局部变量,改变了局部变量的存储区(栈->静态存储区)以及生命周期(离开作用于之后,并未被销毁,仍然驻留在内存,直到程序销毁,但是我们不能再对它进行访问),但未改变其作用域。
- 修饰全局变量和函数,并未改变其存储位置及生命周期,而改变了其作用域,使当前文件外的源文件无法访问该变量和该函数。
- 修饰类的成员变量,使其成为类的全局变量,被类的所有对象共享。
- 修饰类的成员函数,所有对象共享该函数,函数属于类的,不需要创建对象即可访问;静态成员函数只能访问静态成员变量,不可访问非静态成员变量。
3.const的作用
- 限定变量为不可修改
- 限定成员函数不可以修改任何数据成员
- 不可以同时用const和static修饰成员函数
4.指针和引用的区别
- 指针是变量,存放变量的地址,占用4Byte或者8Byte,引用是别名,不占用内存空间
- 指针可以为空,可以声明之后再初始化,引用必须在声明的时候初始化,而且初始化之后不可再改变
- 指针可以有多级,引用不可以
5.重载、重写、隐藏的区别
Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但是参数或者返回值不同
- 相同的范围(同一个类中)
- 函数名相同
- 参数或者返回值不同
- virtual关键字可有可无
Override(重写):派生类函数覆盖基类函数,用于多态
- 不同的范围(分别位于基类和派生类)
- 函数名相同
- 参数和返回值相同
- 必须有virtual关键字
Overwrite(隐藏),派生类函数屏蔽与其同名的基类函数规则如下
- 派生类与基类函数同名,但是参数不同,基类函数将被隐藏
- 派生类与基类函数同名,并且参数相同,但是基类函数没有virtual关键字,基类函数将被隐藏
6.虚函数与虚函数表相关知识点
- 多态是由虚函数实现的,而虚函数主要是通过虚函数表(V-Table)来实现的。
- 类中若有virtual修饰的成员函数,该类就会有一个虚函数表
- 该类定义的对象会有一个虚函数指针指向类的虚函数表,原始基类的对象的虚函数指针指向基类的虚函数表
- 有纯虚函数的类为抽象类,不能被实例化。
7.C++中struct和class的区别
- 默认继承权限
- 成员的默认访问权限
8.数组指针和指针数组
- int (*ptr)[5],数组的指针相当于二维数组,也就是指针的指针
- int *ptr[5],指针数组是一个数组,数组存放的元素为指针
9.strlen和sizeof的区别
- strlen是函数,在运行时才能计算,返回字符串的长度,必须以‘\0’结尾;sizeof是运算符,在编译时就计算好了。
10.进程和线程
- 进程是程序指令和相关资源的集合,是程序的运行实体,一个进程可以包含多个线程
- 进程是资源分配的基本单位,线程是程序调度的基本单位,线程共享进程的资源(动态堆,静态存储区,代码段),但是具有自己独立的栈空间和寄存器
- 进程的频繁切换需要包含进程资源的保护和恢复动作,因此会引起多额外的开销进而影响系统的性能,另外进程间的通信要求复杂的系统级实现,线程的切换比较快,容易实现并发,而且可以通过共享资源的方式进行多线程之间的通信,但是需要考虑同步的问题。