注:面试过程中整理的学习资料,如有侵权联系我即刻删除。
目录
介绍一下标准库vector是怎么进行内存管理的?resize和reserve分别有什么作用?
说一下引用和指针的区别。常引用有什么作用呢?将引用作为函数参数有什么好处?拷贝构造函数的参数为什么要用引用呢?
为什么我们有些类会定义虚析构函数?如果不定义成虚析构函数会怎么样呢?
为什么有了虚析构函数,delete父类的指针(指向子类的对象)就能先调用子类的析构函数?
一个类包含一个普通成员函数、一个虚函数、一个纯虚函数,那么这个类的sizeof()有多大?为什么是4字节?虚表?
static_cast 和 dynamic_cast 的区别(RTTI)
基类指针指向子类对象,访问子类中的虚方法,称为多态。那么子类指针指向基类对象呢?
怎么得到数组的长度?
sizeof(array)/sizeof(array[0]);但是这种计算不适用于数组作为函数参数的时候,当数组名作为函数参数,会退化成指针。解决方法就是将数组引用的数组大小也声明为一个函数参数。动态数组用.size()就可以得到长度。
怎么禁用类中的拷贝构造函数?
将拷贝构造函数和重载赋值运算符设为private来禁止拷贝。
介绍一下标准库vector是怎么进行内存管理的?resize和reserve分别有什么作用?
(1)vector是一种序列式容器(其中的元素可以排序,但是并未排序)。它和array一样,存储空间是一段连续的内存,因此支持随机访问,但是,和array相比,vector支持动态增加删除数据。
(2)特征量有:size是vector当前所包含的元素个数;capacity是当前可以使用的容量,也就是预分配存储空间的大小,capacity大于等于size;
reserve和resize的区别是:reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素;resize的作用是改变vector中元素的数目且创建对象,调用完resize可以直接引用vector的元素了。如果n比当前的vector元素数目要小,vector的容量要缩减到n,并移除那些超出n的元素同时销毁他们(此情况resize一个参数n)。如果n比当前vector元素数目要大,在vector的末尾扩展需要的元素数目,如果第二个参数val指定了,扩展的新元素初始化为val的副本,否则按类型默认初始化。resize完了之后size就等于n了。注意: 如果n大于当前的vector的容量(capacity),将会引起自动内存分配。
指针操作有什么好处?
指针可以动态分配内存,很灵活。比如估计不到我们需要多少个变量,这个时候就需要指针。
数据结构离不开指针,链表、树、图都是离不开指针的。
交换两个数的值有几种写法
指针传递,直接交换ab所在地址中的值的,但并不改变指针的指向。
二级指针传递,通过交换指针指向的地址来交换两个值。
反正平级传递,是交换不了ab的值的。
说一下引用和指针的区别。常引用有什么作用呢?将引用作为函数参数有什么好处?拷贝构造函数的参数为什么要用引用呢?
(1)指针是实体,需要分配内存空间,引用只是变量的别名,不需要分配内存空间;引用在定义的时候必须进行初始化,并且不能够改变,指针定义的时候不一定初始化,指向的空间可变;指针和引用的自增运算结果不同,指针++是指向下一个空间,引用自增是指引用的变量值加一;sizeof引用得到的是对应变量的大小,sizeof指针就是指针本身的大小。
(2)常引用是 const int &y = x; 常引用是让变量引用具有只读字段,不能通过y去修改x了。常引用的初始化有两种,一种是用变量来初始化常引用,一种是用字面值来初始化常引用。
int x1 = 30;
const int &y1 = x1;//变量初始化常引用
const int &m = 43;//字面值初始化常引用
如果用int &m = 43;会报错,引用是给内存取别名,字面值没有内存,没有内存无法取别名。而字面值初始化常引用,编译器会给字面值分配内存空间。
(3)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,指针传递本质上也是值传递,传递的是一个地址。在被调函数中同样要给形参分配存储单元,且需要重复使用\"*指针变量名\"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。
(4)因为,如果假设拷贝构造函数中的参数不是引用类型的话,我们将对象传进去,又会继续触发拷贝构造函数,陷入无限循环,所以只能用引用类型。而用const引用是为了防止传入的对象在拷贝构造函数中被修改,是为了告诉程序员这个变量是只读的。
哪些地方会调用拷贝构造函数?
一个对象去初始化另一个对象;函数以对象作为参数传递ÿ