本文目录
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
,然后调用相应函数;但是如果构造函数还没执行,这个对象根本就没有初始化虚函数表指针,自然也就无法调用虚函数了
二、析构函数是可以的!
析构可以并且推荐采用虚析构