c++ 面试总结(一)

来源:互联网 发布:js event 编辑:程序博客网 时间:2024/05/12 22:18

1.线程与进程的区别及联系:

进程概念:进程是表示资源分配的基本单位,又是调度运行的基本单位。

线程概念:线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。

引入线程的好处:(1)易于调度(2)提高并发性(3)开销少(4)利于充分发挥多处理器的功能。 2. 进程和线程的关系:

1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。

3)处理机分给线程,即真正在处理机上运行的是线程。

4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信办法实现同步。

2.进程死锁的原因?死锁的四个必要条件?

原因:资源竞争及进程推经顺序的非法。条件:1.互斥 2.请求保持 3.不可剥夺 4.环路

3.什么是虚函数及作用?虚函数是怎样实现的?虚函数使用了虚函数表实现的。

简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。

4.类、继承、封装、多态的理解?

类:把一些具有共性的对象归类后形成一个集合,也就是所谓的类。

抽象类:不用来定义对象而只作为一种基本类型用作继承的类。

继承:继承实在已有类的基础上创建新类的过程,已有类成为基类,新类成为派生类。

      派生类从父类那里获取某些已有的特征,这种现象称为类的继承。

封装:将低层次的元素组合起来形成新的高层次实体的技术;函数为封装的一种形式;

多态:接口的多种不同的实现方式即为多态。

多态的作用:1.隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;

2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用

5. OSI七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层;

  TCP/IP四层模型:应用层、传输层、互连层、网络层;

6. 解释堆和栈的区别。

栈:由编译器自动分配释放,存放函数的参数值,局部变量的值等。

堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。

7. C++是不是类型安全的?不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)

8. 内存的分配方式

1、静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在;

2、栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限;

3、堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存;

9SendMessagePostMessage有什么区别:

答案:SendMessage是阻塞的,等消息被处理后,代码才能走到SendMessage的下一行。PostMessage是非阻塞的,不管消息是否已被处理,代码马上走到PostMessage的下一行。

10. class struct的区别?

struct 的成员默认是公有的,而类的成员默认是私有的。

11.   什么是UDPTCP的区别是什么?

TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。

UDP全称为用户报文协议,它可以提供非连接的不可靠的点到多点的通信。

 

12. winsock建立连接的主要实现步骤?

服务器端:socket()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接, accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。

客户端:socket()建立套接字,连接(connect)服务器,连接上后使用send()recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。

13. .delete delete []区别

delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数;

14. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?

答、全局变量储存在静态数据区,局部变量在堆栈中。

15. static有什么用途?答、1.限制变量的作用域。2.设置变量的存储域;

16. .New delete malloc free 的联系与区别?

答案:都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new会自动调用对象的构造函数。delete 会调用对象的destructor,而free不会调用对象的destructor.

17.分别写出BOOL,int,float,指针类型的变量a的比较语句。

答案:BOOL :    if ( !a ) or if(a)
int :     if ( a == 0)
float :   const EXPRESSION EXP = 0.000001
          if ( a < EXP && a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)

18. 类成员函数的重载、覆盖和隐藏区别?

a.成员函数被重载的特征:
1)相同的范围(2)函数名字相同(3)参数不同(4virtual关键字可有可无;
 b.覆盖是指派生类函数覆盖基类函数,特征是:
1)不同的范围(2)函数名字相同(3)参数相同(4)基类函数必须有virtual关键字。
 c.“隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

19. h头文件中的ifndef/define/endif的作用?答:防止该头文件被重复引用。

20. .关键字static的作用是什么?

C语言中,关键字static有三个明显的作用:

1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数

据和代码范围的好处和重要性

原创粉丝点击