面经百度

  1. new、malloc的区别

    1. 属性:运算符、函数;

    2. 参数:分配大小

    3. 返回类型:new返回对象的类型 malloc返回void(*);

    4. 分配失败:new 抛出bac_alloc异常 malloc返回NULL;

    5. 自定义类型:

      1. new先调用operator new 函数申请足够的内存(底层使用的malloc) 然后再调用类型的构造函数,初始化成员变量,最后返回自定义的类型指针;

      2. delete先调用析构函数,再调用operator delete函数释放内存(底层是free);

    6. 重载:new可以重载,malloc不可以重载;

    7. 内存区域:new操作符从自由存储区上为对象动态分配内存,而malloc从堆上分配内存;

  2. delete 和delete[]区别

    1. delete   ptr   代表用来释放内存,且只用来释放ptr指向的内存。

    2. delete[]   rg   用来释放rg指向的内存,!!还逐一调用数组中每个对象的destructor!!

    3. 对于像int/char/long/int*/struct等等简单数据类型,由于对象没有destructor,所以用delete 和delete [] 是一样的!但是如果是C++对象数组就不同了!

    4. new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。

  3. C++的特性

    1. 封装:是指将客观视为抽象成类,每个类堆自身的数据和方法进行保护;类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏;

    2. 继承:可以使用现有类的所有功能,而不需要重新编写原来的类,它的目的是为了进行代码复用和支持多态;

    3. 多态:指同一个实体同时具有多种形式,主要体现在类的继承中体系中,将父类设置成为一个或更多的它的子对象相等的几乎是,赋值以后,父对象可以根据当前赋值给他的子对象的特性以不同的方式运作;简单的说就是允许子类类型的指针赋值给父类类型的指针;

      1. 编译时多态为静态多态;

      2. 运行时为动态多态;

      3. 多态的实现:虚函数,在基类函数签加上virtual关键字,在派生类中重写该函数,运行时会根据对象的实际类型来调用相应的函数,如果对象是派生类就调用派生类的函数,如果是基类就调用基类的函数;

        1. 用virtual修饰的函数叫做虚函数;虚函数肯定是类的成员函数;

        2. 存在虚函数的类都有一个一维的虚函数表,类的对象有一个指向虚函数表开始的虚指针;虚表和类是对应的;虚函数指针和对象是对应的;

        3. 多态性是一个接口的多种实现,是面向对象的核心,分为类的多态性和函数的多态性;

        4. 多态用虚函数来实现,结合动态绑定;

        5. 纯虚函数是虚函数再加上=0;

        6. 抽象类是包括至少一个纯虚函数的类;

        7. 纯虚函数;virtual void fun()=0;抽象类,必须在子类实现这个函数,也就是先有名称,没有内容,在子类中实现内容;

  4. 虚函数和纯虚函数的区别,纯虚函数可以实例化吗,虚函数的实现(同上);

  5. 构造函数和析构函数可以为虚函数吗,在父类情况下哪个可以为虚函数,哪个不可以

    1. 构造函数不可以设置为虚函数:因为构造函数是构造一个对象,虚函数是在运行期间,如果设置为虚函数,在运行期间构造对象?与构造函数的原理违背;

    2. 析构函数可以设置为虚函数;在继承关系中 父类的析构函数设置为虚函数;防止内存泄漏;

      1. 如果基类是虚析构函数;这时候看p所赋值的对象是父类的对象还是子类的对象;如果是子类的对象,先调用子类的析构函数再调用父类的析构函数;如果是基类的对象就不用调用子类的析构函数了;

      2. 如果基类不是虚析构函数;只看指针的数据类型不会去调用赋值的对象;

  6. 什么是引用,引用和指针的区别,什么是常引用,什么时候用常引用。sizeof引用和指针的时,值分别是什么

    1. 相同点:两者都是地址的概念

    2. 不同:

      1. 指针是一个实体,引用是一个别名

      2. 指针使用的时候需要解引用,引用不必;

      3. 引用只能在定义的时候被初始化一次,指针可变;

      4. 引用不能为空,指针可以为空;

      5. sizeof得到的是引用的对象的大小,指针的为指针本身的大小为4;

      6. 自增意义不一样;

    3. 常引用:常引用声明方式:const  类型标识符  &引用名 = 目标变量名;

      1. 如果既想要提高程序的效率,又想要保护传递给函数的数据在函数中不被改变,那么这时候用常引用;

    4. 引用作为返回值 :

      1. 以引用返回函数值,定义函数时需要在函数名前加&

      2. 用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。

      3. 需要注意的点:

        1. 不能返回局部变量的引用

        2. 不能返回函数内部new分配的内存的引用。

        3. 可以返回类成员的引用,但最好是const。

  7. 结构和联合的区别

    1. 结构体和联合体都是由不同的数据类型组成的,但是在任意同一时刻,联合体中只存在一个被选中的成员,而结构体中所有的成员都存在;在结构体中所有的成员都有自己的内存空间,他们是同时存在的;一个struct变量的总长度等于所有的成员的长度之和;在联合体中所有的成员不能同时占用它的内存空间,他们不能同时存在,它的长度等于最长的成员的长度;

    2. 对联合体的不同的成员赋值会对其他的数据成员进行重写,原来的成员的值就不存在了,而对于结构体的不同的成员的赋值是互不影响的;

  8. 重载(overload)和重写(override)的区别

    1. 重载:

    2. 重写:

    3. 区别:

      1. 范围:重载是同一类,覆盖是子类和父类;

      2. 个数:覆盖只能由一个方法或者是一对方法产生,重载是多个方法之间的关系;

      3. 参数:覆盖要求参数表相同;重载要求参数表不相同;

      4. 覆盖关系中,调用的方法具体是根据对象的类型来决定;而重载是根据参数表;

  9. 什么函数可以在main函数之前执行;全局对象的构造函数;

  10. 内存管理有哪些:

    1. 常量区:bss、数据段、代码段;

    2. 栈;

    3. 他们有什么区别:(堆栈)

      1. 生长方向;

      2. 管理方式;(释放)

      3. 空间大小:堆理论上最大可达到4G但是一般不超过2G;栈windows下 2m,linux下8M;

      4. 碎片问题;

      5. 分配方式:堆动态;栈(静态:编译器完成,动态:alloc函数与堆不同 由编译器释放)。

      6. 分配效率

        1. 栈:机器系统提供,底层支持栈,分配专门的寄存器存放栈的地址,入栈出栈有专门的指令;

        2. 堆;c/C++库函数提供,机制比较复杂;

  11. const和define的区别:

    1. 定义常量上:const带类型;

    2. 作用阶段:const 编译阶段,define:预处理阶段;

    3. 作用方式:const有类型检查;

    4. 占用空间(存储区域):define代码段、const数据段;

    5. 调试:define不可以调试;

    6. 再定义;

    7. 防止头文件重复引用;

  12. map和unordered_map的区别:

    1. 底层数据结构不同:红黑树和哈希表

    2. 时间复杂度:logn 和O(1);

    3. 使用场景:

      1. map:(考虑有序,查询速度快,稳定容器元素少于1000、非频繁查询)

      2. hashmap(无序,查询速度快、数据量大、高频查询);

  13. vector和list的区别

    1. 底层数据结构:数组和双向链表

    2. 查询比较:一个随机访问,一个不随机访问

    3. 插入比较:插入需要移动很多;只需要修改指针;

  14. 动态绑定和静态绑定

    1. 静态类型:对象在声明的时候采用的类型,编译阶段已经确定;

    2. 动态类型:通常指一个指针或者是引用目前所指对象的类型;在运行阶段确定;

    3. 静态绑定:绑定的是静态类型;所对应的函数或者是属性依赖于对象的静态类型,发生在编译阶段;

    4. 动态绑定:绑定的是动态类型,所对应的函数或者是属性依赖于对象的动态类型;发生在运行阶段;

  15. c与C++的区别

    1. 面向过程:主要以函数为主,和面向对象主要以类为主;

    2. 头文件不同

    3. cin cout;bool 、const

    4. c++支持重载;

  16. tcp和udp的区别

    1. 区别:

    2. 可靠性的保障

      1. 检验和

      2. 序列号:对每个字节进行编号

        1. 可靠性

        2. 按序到达

        3. 提高效率多次发送一次确认

        4. 去重

          数据传输过程中的确认应答处理、重发控制、等功能都可以通过序列号来实现

      3. 确认应答机制 ACK

      4. 超时重传

      5. 链接管理 三次握手 四次挥手;

      6. 流量控制:防止较快主机致使缓冲区溢出;

      7. 拥塞控制;

    3. 保证消息有序:

      1. 为了保证消息的可靠性传输,发送方将自己发送的数据保留在缓冲区;

      2. 并且为每个发送的数据保留一个超时定时器;

      3. 如果在定时器超时之前收到了对方的应答消息,释放缓冲区;

      4. 否则重传该数据包;直到应答或者是重传次数超过设定的最大次数为止;

      5. 接收到数据后进行crc校验如果正确就交给上层协议;然后给发送方发送一个累积应答包;表明该数据已经收到;如果也有数据要发送就将应答包放在数据中一块发过去;

  17. get、post的区别

    1. 效率:

      1. get得,从服务器获取数据,效率比较高

      2. post:可以向服务器发送和下载数据,效率低;

    2. 缓存:

      1. get请求能被缓存,默认的请求方式也是缓存的;重复请求是幂等的,结果都一样;

      2. post请求默认不被缓存,post请求的url没有参数,每次请求的url都是一样的数据体可能不同,无法对应;所以缓存没有意义;

    3. 安全性:

      1. get的所有参数全部包装在url中,明文显示,且服务器的访问日志会记录,非常不安全;

      2. post的url中只有资源路径,不包含参数,参数封装在二进制的数据体中;服务器不会记录参数,相对安全;

    4. 数据量:http没有对get和post请求的数据大小进行限制但是实际应用的时候受软硬件的限制;

      1. get:不同的浏览器不同,一般在2~8K,更加常见的事1K之内

      2. post方法提交的数据比较大,大小靠服务器的设定值限制;php默认2M;

  18. http状态码

    1. 1XX表示服务器接收到请求,需要请求者继续执行操作;

    2. 2XX表示操作被成功接收并处理

    3. 3XX重定向,需要进一步的操作以完成请求;

    4. 4XX客户端错误

    5. 5XX服务器错误

  19. http与https的区别

    1. http是超文本传输协议,信息是明文的,不安全,https则具有安全性的ssl加密传输协议;

    2. https需要到ca申请证书,一般免费证书少,需要费用;

    3. 两种使用不通的链接方式,使用端口不同 80和443;

    4. http的链接简单无状态;https协议是由ssl协议+http协议构建的可进行加密传输、身份认证的网络协议,比http安全;

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值