41. 类成员函数的重载、覆盖和隐藏的区别?
① 成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
② 覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
③ “隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
42. 堆栈溢出一般是由什么原因导致的?
① 没有回收垃圾资源
② 层次太深的递归调用
43. C++中的空类,默认产生的类成员函数:
class
{
public:
Empty(); // 缺省构造函数
Empty(const Empty&); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=(const Empty&); // 赋值运算符
Empty* operator&(); // 取值运算符
const Empty* operator&() const; // 取值运算符const
};
44. 进程间通信的方式有?
进程间通信的方式有 :共享内存, 管道(有名管道/无名管道),Socket ,消息队列 ,信号,信号量,内存映射等。
45. 进程死锁的原因?
资源竞争及进程推进顺序非法。
46. 死锁的四个必要条件?
互斥,请求保持,不可剥夺,环路。
47. 类的静态成员和非静态成员有什么区别?
类的静态成员每个类只有一个,即是属于本类的;类的非静态成员每个对象都有一份。
48. 什么是浅拷贝?什么是深拷贝?
浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个
对象的改动都会影响另外一个对象。
深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。
一般来说,浅拷贝就是复制那个对象的指针。深拷贝就是复制了那个对象。
补充问题:
临时对象:临时对象的开销比局部对象小些
49. 那些情况需要调用拷贝构造函数,请举例?
a.一个对象以值传递的方式传入函数体
b.一个对象以值传递的方式从函数返回
c.一个对象需要通过另一个对象进行初始化
50. C和C++有什么不同?
① 从机制上:c是面向过程的(但c也可以编写面向对象的程序);c++是面向对象的,提供了类。但是,c++编写面向对象的程序比c容易
② 从适用的方向:c适合要求代码体积小的,效率高的场合,如嵌入式;c++适合更上层的,复杂的;linux核心大部分是c写的,因为它是系统软件,效率要求极高。
③ C语言是结构化编程语言,C++是面向对象编程语言。C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。
51. C++中virtual与inline的含义分别是什么?
在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。
inline与函数的定义体放在一起,使该函数称为内联。inline是一种用于实现的关键字,而不是用于声明的关键字。
虚函数的特点;如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。
内联函数的特点;使用内联函数的目的是为了提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数的时间是以代码膨胀为代价的。内联函数不能包含循环语句,因为执行循环语句要比调用函数的开销大。
一个函数能否即是虚函数又是内联函数?
可以,建议不使用?
52. 数组和链表的区别?
数组的数据是顺序存储的,存储大小固定。
链表的数据可以随机存储,存储大小可以动态的改变。
53. C++容器的分类及各自的特性?
C++容器分为顺序容器和关联容器。二者的本质区别在于:关联容器通过键(key) 存储和读取元素,而顺序容器的元素排列次序与元素值无关,是由元素添加到容器的顺序决定的,通过元素在容器中的位置顺序存储和读取元素。
标准库定义了三种顺序容器类型,包括:vector、list、deque。
容器内的元素类型必须至少满足2个条件:可复制和可赋值。
vector是连续存储的,能支持快速随机访问,list不需要连续存储,能在中间快速插入和删除,deque是双端队列,具有后进先出的特性。
所有的迭代器范围都是左闭合区间, [begin,end) 包括begin,但不包括end
list迭代器不支持算术运算,不支持关系运算,也没有下标操作,只有最简单的自增 自减 相等 不等 运算。
标准库还提供了三种容器适配器:后进先出的stack、先进先出的queue和有优先级管理的priority_queue。stack可以建立在vector、list、deque上,queue要能提供push_front操作,不能建立在vector上,priority_queue要求提供随机访问能力,只能建立在vector或deque上。
标准库提供的关联容器有map、set、multimap和multiset。
map存储键值对,set存储单个键,multimap和multiset支持同一个键多次出现。
set与map不同的地方在于:set仅有key_type类型,它的value_type 也就是key_type;而且set不提供下标操作。map支持下标操作,而且与下标访问数组或者vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新元素。
54. windows应用程序的类型?
控制台程序、窗口程序、库程序(静态/动态)
55. 窗口程序的创建过程?
a.定义WinMain入口函数 b. 定义窗口处理函数 WindowProc
c. 注册窗口类RegisterClass d. 创建窗口CreateWindow
e. 显示窗口ShowWindow/UpdateWindow
f. 消息循环GetMessage
TranslateMessage
DisptachMessage
g. 消息处理
56. win32程序的执行机制?
Win32窗口程序是采用 事件驱动 方式执行,也就是 消息机制。
(程序的执行机制分为 过程驱动和事件驱动)
57. 列举win32中与消息相关的几个函数?
GetMessage - 获取消息
TranslateMessage - 翻译消息。将按键消息,翻译成字符消息
DispatchMessage - 派发消息。将消息派发到该消息所属窗口的窗口处理函数上。
58. 列举几个常用的窗口消息?
WM_DESTROY、WM_SYSCOMMAND、WM_CREATE、WM_SIZE、WM_QUIT、WM_PAINT等。
59. Windows中消息可以分为几类?
系统消息——由系统定义好的消息,可以在程序中直接使用。
用户自定义消息——由用户自己定义,满足用户自己的需求。由用户自己发出消息,并响应处理
应用程序消息——程序之间通讯时使用的消息。
系统注册消息——在系统注册并生成相应消息,然后可以在各个程序中使用这个消息。
60. 消息队列的类型?
系统消息队列——由系统维护的消息队列。存放系统产生的消息,例如鼠标、键盘等。
程序消息队列——属于每一个应用程序(线程)的消息队列。由应用程序(线程)维护。