2023届C/C++软件开发工程师校招面试常问知识点复盘Part 1

1、类A其中有一个函数,函数功能只是打印“hello world”,如果:A p = new A();之后delete了这个p然后使用p指向这个函数会发生什么?

答案:

依旧会执行这个函数

delete p是销毁这个对象,回收相应的资源,但是还可以通过该指针去访问其成员函数


原因:

函数的调用地址在编译期间就已经确定,而且虚函数的地址只跟类定义本身有关,与具体的实例对象无关,所以当对象的内存会销毁掉,并不会影响到对其非虚函数的调用。所以此次函数的调用可以成功。当然,如果该函数内部调用了对象的数据成员,还是会发生崩溃的。

  • 此外,如果调用的是虚函数就不会成功,因为类对象被销毁后,就无法找到存储在对象内存空间头部的虚函数表指针,因此也就无法找到虚函数表,更无法找到虚函数。
2、纯虚函数的使用场景?它的存在意义?

场景与意义:

  • 对于虚函数,子类可以(也可以不)重新定义基类的虚函数,该行为称之为复写Override。
  • 对于纯虚函数,子类必须提供纯虚函数的个性化实现。
  • 子类如果不提供纯虚函数的实现,编译将会失败。
  • 当使用类的指针调用成员函数时,普通函数由指针类型决定,而虚函数由指针指向的实际类型决定
  • 虚函数的实现过程:通过对象内存中的虚函数指针vptr找到虚函数表vtbl,再通过vtbl中的函数指针找到函数地址并进行调用。
  • 纯虚函数是在基类中声明的虚函数,它要求任何派生类都要定义自己的实现方法,以实现多态性。
  • 含有纯虚函数的类称之为抽象类,它不能创建对象(创建实例),只能创建它的派生类的实例
  • 如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。
  • 如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。
3、C++11新特性?R"()"中R的含义?

  • 在 C++11 中添加了定义原始字符串的字面量,定义方式为:R “xxx(原始字符串)xxx” 其中()两边的字符串可以省略。

  • 原始字面量 R 可以直接表示字符串的实际含义,而不需要额外对字符串做转义或连接等操作。
    在这里插入图片描述


4、知道内存泄漏?
  • 一般我们常说的内存泄漏是指堆内存的泄漏

  • 堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定)内存块,使用完后必须显式释放的内存

  • 应用程序一般使用malloc,、realloc、new等函数从堆中分配到块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏


解决方法:

1、析构函数

2、成对出现

3、数组释放要[]

4、使用智能指针


5、智能指针一定不会造成内存泄漏吗?使用的时候要注意什么?
  • 循环引用是指使用多个智能指针shared_ptr时,出现了指针之间相互指向,从而形成环的情况,有点类似于死锁的情况,这种情况下,智能指针往往不能正常调用对象的析构函数,从而造成内存泄漏

  • 解决如下-----------:

  • 实际编程过程中,应该尽量避免出现智能指针之间相互指向的情况,如果不可避免,可以使用使用弱指针——weak_ptr,它不增加引用计数,只要出了作用域就会自动析构

  • 弱指针用于专门解决shared_ptr循环引用的问题,weak_ptr不会修改引用计数,即其存在与否并不影响对象的引用计数器

6、有一个很多数据的大数组,我想拿到前十个最大的,怎么拿?堆排序

堆排序:利用大顶堆小顶堆进行排序的算法 O(nlogn)

大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于降序排列

小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于升序排列

7、堆排序的时间复杂度?时间复杂度的定义、概念?

nlogn它定量描述了该算法的运行时间。算法中的基本操作的执行次数,为算法的时间复杂度

8、右值引用?

右值:就是在内存没有确定存储地址、没有变量名,表达式结束就会销毁的值
右值引用:就是绑定到右值的引用,通过&&来获得右值引用。

可将右值引用归纳为:非常量右值引用只能绑定到非常量右值上;常量右值引用可以绑定到非常量右值、常量右值上。

非常量const只能指向(管理)非常量的元素,因为有可能会改变这个元素

常量const因为不会修改指向的元素,所以既可以指向常量元素,也可以指向非常量元素

9、构造函数可以是virtual吗?原因?析构呢?

一、构造不可以,为什么?

因为如果构造函数是虚函数,那么就需要通过虚函数表vtable 来调用,虚函数表vtable指针又必须是构造函数初始化的,所以不行

注意: C++中使用虚函数,需要使用this找到虚函数表指针———>虚函数表vtable,然后调用相应函数;但是如果构造函数还没执行,这个对象根本就没有初始化虚函数表指针,自然也就无法调用虚函数了


二、析构函数是可以的!

析构可以并且推荐采用虚析构

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡与乌龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值