1.static & extern
被static修饰的变量只能在本文件中访问
extern 是指外部声明 也就是在此处声明 在外部定义 扩大函数的作用域
2.const的作用是什么
限定一个只读变量
限定函数参数 做形参的时候只能读取不能改变
3.常量指针和指针常量
4.面对对象的三大特征
封装 把客观事物封装成抽象的类
继承 在无需重新编写原有类的情况下对功能进行扩展
多态
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
方法:覆盖 子类重新定义父类虚函数
重载 就是运行徐存在多个重名的函数 他们的参数表不同
5. new delete 以及 malloc free
new delete 是c++关键字 需要调用构造函数和析构函数
malloc和free是 库函数 需要指定申请内存的大小
6.多态与 虚函数
静态多态: 编译 通过函数和运算符的重载
动态多态:通过类继承关系和虚函数来实现 就是说呢 在运行的时候 我们无法通过函数名和参数来确定调用哪个函数 必须在程序执行过程中具体情况来确定
virtual
虚函数是类的成员函数
析构函数也可以是虚函数 (撤销对象的多态性)
构造函数不可以 因为构造函数执行的时候对象还没有完成实例化
7.指针和引用的区别
指针式所指对象的地址 所以是间接访问 引用是对象的别名 直接访问
引用必须初始化 指针不用
就是说这个引用的话直接是在使用它本身 包括赋值之类的
8.智能指针的作用
处理内存泄漏,空悬指针,资源泄漏
shared_ptr unique_ptr 多个智能指针可以指向同一对象 同一时间只有一个智能指针指向该对象
9.c++ 四种强制类型转换
const_cast
const int* p; //p可变,p指向的内容不可变
int const* p; //p可变,p指向的内容不可变
int* const p; //p不可变,p指向的内容可变
static_cast 是在内置的数据类型之间进行强制转换 不进行类型检查保证安全性
dynamic_cast 仅能应用于指针或者引用,不支持内置数据类型
reinterpret_cast<T*>(a)不常用
10.死锁产生 的条件
虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。 [2]
1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
数据结构和算法
1.十大排序
https://www.cnblogs.com/itsharehome/p/11058010.html
(1)选择排序 直接选最小的依次
(2)插入排序 一个一个插入到有序位置
(3)冒泡排序
(4)希尔排序
(5)归并排序 分治思想
(6)快速排序 设定中轴 不断递归
(7)堆排序 构造一个大顶堆或者小顶堆
操作系统
1.进程调度算法
FCFS,时间片轮转法,最短进程优先,最短剩余时间优先,最高响应比优先
https://www.nowcoder.com/tutorial/93/675fd4af3ab34b2db0ae650855aa52d5
https://blog.csdn.net/shanghairuoxiao/article/details/72876248
2.系统调用
操作系统的状态分为核心态和用户态
通常的用户程序只在用户态下运行 要访问系统核心功能 核心态 用户进程主动要求切换到内核态的一种方式 就要系统调用 比如fork 和vfork
异常 在执行用户态程序时候 发生异常 也切换到处理这个异常的核心态中
中断 外设引起 也切换到核心态
3.进程间通信方式
管道PIPE
系统IPC 消息队列 信号量
信号
共享内存
socket
socket是应用层和TCP/IP之间的接口
4.运行 阻塞 就绪