华为软件类常见面试问题集锦

1:请你分别划分OSI的七层网络结构图,和TCP/IP的层次结构?

 OSI从低到高分别是:物理层数据链路层网络层传输层、会话层、表示层应用层

TCP/IP的四层结构图:数据链路层网络层传输层、应用层。

 

Q2:请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用?TCP与UDP呢?

IP协议是用于将多个包交换网络连接起来的,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。

 在网络层。TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议.UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。提供面向事务的简单不可靠信息传送服务。事务是指访问并可能更新数据库中各种数据项的一个程序执行单元。
 

Q3:请问C++的类和C里面的struct有什么区别?

 C的struct从根本上也只是个包装数据的语法机制。C++中的类可以有成员函数,C++中类访问访问权限是private的,而struct中则是public的。
 
C++中的类和C++中的结构体相同点:
(1)都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
(2)都可以有一大堆public/private/protected修饰符在里边;
(3)虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:A a = {1, 2, 3};不管A是个struct还是个class,前提是这个类/结构足够简单,比如所有的成员都是public的,所有的成员都是简单类型,没有显式声明的构造函数。
(4)都可以进行复杂的继承甚至多重继承,一个struct可以继承自一个class,反之亦可;一个struct可以同时继承5个class和5个struct,虽然这样做不太好。
(5)如果说class的设计需要注意OO的原则和风格,那么没任何理由说设计struct就不需要注意。
(6)再次说明,以上所有说法都是指在C++语言中,至于在C里的情况,C里是根本没有“class”,而C的struct从根本上也只是个包装数据的语法机制。

 

Q5:请讲一讲析构函数和虚函数的用法和作用?

析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。 
有适放内存空间的做用。 析构函数是用来释放类的,虚函数用于基类指针指向派生类对象。
虚函数是C++多态的一种表现 
例如:子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virturl(虚函数)。
使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。

如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virturl 函数名=0
我们把这样的函数(方法)称为纯虚函数。
如果一个类包含了纯虚函数,称此类为抽象类 。

Q6:全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

 变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。一些变量在整个程序中都是可见的,它们称为全局变量。一些变量只能在一个函数中可知,称为局部变量。这就是他们的区别。 
在任何函数外面定义的变量就是全局变量,在函数内部定义的变量是局部变量,这是它们在程序中的实现过程。 
操作系统和编译器是根据程序运行的内存区域知道他们的,程序的全局数据放在所分配内存的全局数据区,程序的局部数据放在栈区

 

Q7:C++内存管理等一些知识。

一.内存的常见分配方式

  1. 从静态区分配,一般是全局变量和static类型变量

  2.从栈区分配内存,一般是局部的变量,会随着所在函数的结束而自动释放

  3.从堆中分配,一般是使用手动分配,使用malloc()函数和new来申请任意大小空间,不过要手动释放空间,相应的使用free()函数和delete释放,

    如果不释放该空间,而且指向该空间的指针指向了别的空间.则该空间就无法释放,造成内存泄露,造成了内存浪费

二.内存的使用规则

  1.在使用malloc()或new申请空间时,要检查有没有分配空间成功,判断方法是判断指针是否为NULL,如申请一块很大的内存而没有这么大的内存则分配内存会失败

  2.申请成功后最好是将该内存清空,使用memset()后ZeroMemory()清空,不然存在垃圾而造成有时候输出很大乱码

  3.不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。

  4.要防止数组或指针内存越界,

  5.申请内存成功后,使用结束后要释放,系统不会自动释放手动分配的内存

  6.内存释放后,指针还是指向那块地址,不过这指针已经是"野指针"了,所以释放内存后指针要指向NULL,不然很危险,容易出错,if()对野指针的判断不起作用

  

Q9:内存泄露和内存溢出区别?

内存泄漏是指程序由于错误或漏洞造成的内存占用过多,或占用内存后无法释放。内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。
内存溢出是指已有的数据超过了其获得到的内存所能存储的范围,比如用一个字节存放1000这个数字就属于内存溢出。

原文地址:https://www.cnblogs.com/K2154952/p/4789663.html