2018秋招面试问题(五、C++基础问题)

本文整理了C++面试中的常见问题,包括数组长度获取、拷贝构造函数禁用、vector内存管理、指针和引用的区别、虚函数、多态等。通过这些问题,深入理解C++的关键概念和技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:面试过程中整理的学习资料,如有侵权联系我即刻删除。

目录

怎么得到数组的长度?

怎么禁用类中的拷贝构造函数?

介绍一下标准库vector是怎么进行内存管理的?resize和reserve分别有什么作用?

指针操作有什么好处?

交换两个数的值有几种写法

说一下引用和指针的区别。常引用有什么作用呢?将引用作为函数参数有什么好处?拷贝构造函数的参数为什么要用引用呢?

哪些地方会调用拷贝构造函数?

什么时候会重载运算符

虚函数是如何实现的?

C++中为什么虚函数比非虚函数耗费的时间更多?

什么是静态绑定?什么是动态绑定?

为什么我们有些类会定义虚析构函数?如果不定义成虚析构函数会怎么样呢?

为什么构造函数不可以是虚函数?

构造函数中是否可以调用虚函数

C++哪些函数不能声明为虚函数

为什么有了虚析构函数,delete父类的指针(指向子类的对象)就能先调用子类的析构函数?

为什么析构的时候是先调用派生类析构,再调用基类析构?

一个类包含一个普通成员函数、一个虚函数、一个纯虚函数,那么这个类的sizeof()有多大?为什么是4字节?虚表?

虚函数指针的作用?

虚表指针存在对象的什么地方?

虚函数表存放在哪里?

上行转换和下行转换

static_cast 和 dynamic_cast 的区别(RTTI)

基类指针指向子类对象,访问子类中的虚方法,称为多态。那么子类指针指向基类对象呢?

C++对象的内存布局


怎么得到数组的长度?

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引用是为了防止传入的对象在拷贝构造函数中被修改,是为了告诉程序员这个变量是只读的。

哪些地方会调用拷贝构造函数?

一个对象去初始化另一个对象;函数以对象作为参数传递ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值