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


    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这个数字就属于内存溢出。

  • 相关阅读:
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(1)
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建Viewport(2)
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(2)
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之完成登录功能
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口调试
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建Viewport(1)
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建输出验证码图片的控制器
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之调整首页显示
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(3)
  • 原文地址:https://www.cnblogs.com/K2154952/p/4789663.html
Copyright © 2020-2023  润新知