C++面经(持续更新)
Posted 蒟蒻的小博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++面经(持续更新)相关的知识,希望对你有一定的参考价值。
一. c,c++区别<九大点>
c: 面向过程
c++: 面向对象(封装,继承,多态)
对象:对数据和作用于数据的操作组成的封装实体
类:描叙了一组有相同属性和方法的对象<虚拟>
对象为类的实例化,类为对象的抽象
c: 不支持函数重载
c++: 支持函数重载<_Z + len(函数名) + 函数名 + 参数类型首字母> int add(int,int) -> _Z3addii
原因与对函数名修饰规则有关
c: 函数参数为空表示可传任意参数,不传参数需加void
c++: 函数参数为空表示无法传递参数
c: struct中不能有函数
c++: struct中可以有函数
c:不支持函数参数给定默认值
c++:支持函数参数给定默认值
c: 不支持引用
c++: 支持引用
c: 不支持内联函数
c++: 支持内联函数
c: 采用malloc,free管理堆空间
c++: 采用new, delete管理 <new,delete为malloc,free的封装>
c: 仅有全局,局部两个作用域
c++: 有全局,局部,类,namespace作用域
二. 四种类型转换
1.static_cast: 静态转换,用于基类派生类引用和指针的转换<向上安全,向下不安全>;基本数据类型转换<无动态检查>
2.dynamic_cast:动态转换,拥有动态检查,向下转换更安全
3.const_cast:常量转换,常量转非常量<去常量>
4.reinterpret_cast:重新解释,随意转换,最不安全
三. c++引用概念
1.引用可看做的数据的别名<类似快捷方式>
2.引用必须引用合法空间,定于必须初始化,绑定后不许更换<本质为指针常量>
四. 指针常量,常量指针
1.指针常量:int* const p,指针本身值不可变,始终指向同一地址,定于必须初始化
2.常量指针:const int* p,指向“常量”,可指向其他地址,但不能修改内容
......const... 指针常量
...const...... 常量指针<从左往右读>
五. 内联函数作用<特点>
1.inline关键字,避免函数调用带来的开销,如果内联函数太复杂,编译器忽略
2.原理:预处理时,调用inline会将语句复制在调用处<还能解决宏定义问题>
六. new 的实现原理,new 和 malloc 的区别
1.new原理:简单类型直接调用operator new(),new()调用malloc函数,如果失败则调用_callnewh(),如果返回0则抛异常bac_alloc;复杂类型(类),先调用new(),然后在分配的内存上调用构造函数
2.两者区别:new为操作符,malloc为函数;new无需确定内存大小,malloc则需要指出大小;分配失败一个抛出异常一个返回NULL;new会调用构造函数,malloc不会;new可以重载,malloc不行;new从自由存储区分配内存,malloc从堆上动态分配<两者有包含关系,两者区别>;malloc可以用realloc重新分配内存实现扩充,new没有<malloc更加灵活>。
七. 重载,复写,隐藏的区别
1.重载:同一作用域,同名函数的形参不同,构成函数重载,与返回值无关
2.重写:派生类与基类同名、同返回值、同参的虚函数重定义,构成虚函数覆盖<重写>
3.隐藏:不同作用域,同名函数构成隐藏,比如派生类成员函数隐藏与其同名的基类成员函数
隐藏的实质是:在函数查找时,名字查找先于类型检查。如果派生类中成员和基类中的成员同名,就隐藏掉。编译器首先在相应作用域中查找函数,如果找到名字一样的则停止查找。
八. C++ 中智能指针和指针的区别是什么?
1.智能指针是普通指针加上一层封装,本质是一个类模板,可以自动释放所指内存;而普通指针是一种基本类型,需要自己手动释放内存
九. 简述一下 C++ 中的多态
1.多态是同一个事物在不同场景下的多种形态。多态分为静态多态和动态多态。
2.静态多态:编译器在编译期间完成的,根据实参类型来选择调用函数<函数重载,运算符重载,泛型编程等>
3.动态多态:程序在运行时根据基类的引用(指针)指向的实际对象来确定具体调用哪一个虚函数<条件:在继承关系中,有对虚函数的重写,且使用基类引用(指针)指向不同对象>
十.为什么将析构函数设置成虚函数
1.主要是防止内存泄漏,在基类指针指向派生类对象时,如果基类析构函数没有声明为虚函数,则基类指针释放时不会调用派生类析构函数,如果派生类中有对内存的释放,就会造成内存泄漏
<构造函数不能为虚函数,如果构造函数是虚函数,就需要vptr指定,而此时vptr本身还未初始化,构成矛盾>
十一.简述一下堆和栈的区别
1.管理方式:栈是由编译器自动管理,而堆得分配和释放都是程序员控制的
2.空间大小:栈空间小于堆,堆内存几乎没有什么限制,而栈一般有一定大小
3.碎片问题:栈是先进后出的数据结构,内存不存在碎片化,而堆由程序员控制,频繁操作会导致内存空间不连续,产生大量内存碎片
4.生长方向:栈生长方向向下,沿内存地址减小方向增长,堆则是向上,向内存地址增大方向增长
5.分配方式:堆空间都是动态分配,没有静态分配的堆。而栈有静态分配和动态分配,但都是由编译器自动管理的,动态分配可用alloca函数。
6.分配效率:栈是机器系统提供的数据结构,有底层支持,因此栈的效率很高。堆是由c/c++函数提供的,机制复杂,效率低。
十二.请你介绍一下死锁,产生的必要条件,产生的原因,怎么预防死锁
1.死锁:两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种相互等待的现象,若无外力作用,它们将无法推进下去,此时系统处于死锁状态。
2.必要条件:互斥,进程对资源占有具有排它性,其他进程请求该资源只能等待,直至释放;请求和保持,进程已经保持至少一个资源而又提出新的请求,而该资源已被其他进程占有,此时请求阻塞,但自身资源无法释放;不抢占:进程占有的资源在未结束前不能被剥夺,只能由自身释放;循环等待:多个进程产生对占有资源请求环链
3.预防:打破四个必要条件的其中一条即可,有著名的银行家算法
以上是关于C++面经(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章