1.请简要说明C和C++的区别
C语言是面向过程的编程语言,重点在于算法和数据结构,以及怎样解决问题。
C++是面向对象编程,考虑的是构造一个什么样的对象来解决问题,所以C与C++的最大区别在于它们解决问题的思想方法不一样。此外C++几乎完全兼容C语言;支持泛型编程、异常处理等。
2.必须在构造函数初始化式里进行初始化的数据成员有哪些,为什么?
(1)const常量成员,因为常量只能初始化赋值,之后不能改变,所以必须放在初始化列表中;
(2)引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表中;
(3)没有默认构造函数的类所创建的成员,因为使用初始化列表可以不必调用默认构造函数来初始化,而是调用拷贝构造。
3.指针与引用的区别
(1) 指针是一个实体,而引用仅是一个别名;
(2) 引用直接当做变量使用,指针需要解引用;
(3) 引用只能在定义时被初始化,之后不可改变;指针可变;
(4) 引用不能为空,指针可以为空;
(5) “sizeof 引用”得到的是所指向变量的大小,而“sizeof 指针”得到的是指针本身(变量地址)的大小;
(6)程序为指针变量分配内存区域,而引用不需要分配内存区域。
4.全局变量和局部变量有什么区别?内存是如何分配的?操作系统和编译器是如何区分的?
局部变量:定义在函数内
存储在stack
函数调用开始到函数执行结束
只能在函数内使用
全局变量:定义在函数外
data(初始化)或bss(未初始化)
main运行前定义完成,程序结束后释放
程序的任何位置都可以使用
同名时,在函数内局部变量会屏蔽全局变量, 操作系统和编译器通过它们的地址来分辨。
5.死锁产生的原因是什么?死锁的四个必要条件是什么?如何解除死锁?
原因是多个进程或线程互相等待对方的资源,在得到新的资源之前不会释放自己的资源,这样就形成了死循环。
*资源互斥:*资源只有两种状态,只有可用和不可用两状态,不能同时使用,同一时刻只能被一个进程或线程使用。
*占有且请求:*已经得到资源的进程或线程,继续请求新的资源,并持续占有旧的资源。
*资源不可剥夺:*资源已经分配进程或线程后,不能被其它进程或线程强制性获取,除非资源的占有者主动释放。
*环路等待:*死锁发生时,系统中必定有两个或两个以上的进程或线程组成一条等待环路。
可以重启或者手动撤消进程,剥夺资源,打破锁定