2021最新C++面试题

2021-12-27 14:10

  考研才刚刚结束,学子们用了一年或者两年,甚至更久的时间来准备这次考试,所以大家想要进入大厂,那就要做好最好准备,拿最好的状态去好的企业。

C++面试

  1、引用作为函数参数以及返回值的好处

  对比值传递,引用传参的好处:

  1)在函数内部可以对此参数进行修改

  2)提高函数调用和运行的效率(所以没有了传值和生成副本的时间和空间消耗)

  如果函数的参数实质就是形参,不过这个形参的作用域只是在函数体内部,也就是说实参和形参是两个不同的东西,要想形参代替实参,肯定有一个值的传递。函数调用时,值的传递机制是通过“形参=实参”来对形参赋值达到传值目的,产生了一个实参的副本。即使函数内部有对参数的修改,也只是针对形参,也就是那个副本,实参不会有任何更改。函数一旦结束,形参生命也宣告终结,做出的修改一样没对任何变量产生影响。

  用引用作为返回值最大的好处就是在内存中不产生被返回值的副本。

  但是有以下的限制:

  1)不能返回局部变量的引用。因为函数返回以后局部变量就会被销毁

  2)不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak

  3)可以返回类成员的引用,但是最好是const。因为如果其他对象可以获得该属性的非常量的引用,那么对该属性的单纯赋值就会破坏业务规则的完整性。

  2、纯虚函数

  纯虚函数是只有声明没有实现的虚函数,是对子类的约束,是接口继承

  包含纯虚函数的类是抽象类,它不能被实例化,只有实现了这个纯虚函数的子类才能生成对象

  普通函数是静态编译的,没有运行时多态

  3、什么是野指针

  野指针不是NULL指针,是未初始化或者未清零的指针,它指向的内存地址不是程序员所期望的,可能指向了受限的内存

  成因:

  1)指针变量没有被初始化

  2)指针指向的内存被释放了,但是指针没有置NULL

  3)指针超过了变量了的作用范围,比如b[10],指针b+11

  4、线程安全和线程不安全

  线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可以使用,不会出现数据不一致或者数据污染。

  线程不安全就是不提供数据访问保护,有可能多个线程先后更改数据所得到的数据就是脏数据。

  5、C++中内存泄漏的几种情况

  内存泄漏是指己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

  1)类的构造函数和析构函数中new和delete没有配套

  2)在释放对象数组时没有使用delete[],使用了delete

  3)没有将基类的析构函数定义为虚函数,当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确释放,因此造成内存泄露

  4)没有正确的清楚嵌套的对象指针

  6、栈溢出的原因以及解决方法

  1)函数调用层次过深,每调用一次,函数的参数、局部变量等信息就压一次栈

  2)局部变量体积太大。

  解决办法大致说来也有两种:

  1> 增加栈内存的数目;增加栈内存方法如下,在vc6种依次选择Project->Setting->Link,在Category中选择output,在Reserve中输入16进制的栈内存大小如:0x10000000

  2> 使用堆内存;具体实现由很多种方法可以直接把数组定义改成指针,然后动态申请内存;也可以把局部变量变成全局变量,一个偷懒的办法是直接在定义前边加个static,呵呵,直接变成静态变量(实质就是全局变量)

  以上就是小编为大家整理发布的“2021最新C++面试题”一文,更多相关内容尽在开课吧广场C++教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享