寒武纪C++软件研发日常实习生面经,已发offer。
时间:2021年2月23日,形式电话面试,大概30min。
个人背景:哈工大通信本硕,半路出家,计算机基础很差
心态:生平第一次应付企业面试,非常紧张
开场是自我介绍,和聊简历,这一块就不多说了。我的简历写得很满,学科竞赛拿了三次省奖一次国奖,但都和计算机无关,所以聊不出所以然。
然后被单方面提问,全程内容以C++八股文为主,没有录音,所以问题的提问顺序没能完全记住,但大致的题目还是***不离十的。
一上来就是经典老题,谈一谈malloc和new
我一顿口胡,说了这么些:
1.new是C++的关键字,malloc是头文件stdlib.h里的库函数,new是C++新添加的,malloc是C语言里就有的
2.new自动计算所需内存大小,malloc要手动输入内存大小作为函数参数,比如4*sizeof(int)
3.new比malloc更高级,他的底层实现本身就包含了malloc
4.new比malloc更方便,除了第2条讲的无需设置内存大小,new配合构造函数和函数重载时用起来很给力,比如申请一个链表节点或者树的节点时,new加构造函数可以很简短的申请节点并赋值,malloc由于返回(void*)还需要强制转换,再加上其它语句对节点各个成员依次赋值,代码看起来就冗长繁琐,没有new美观。
5.new比malloc更安全(这里他突然打断我问我为什么更安全,我直接慌了,我一顿瞎说,但自知说的不对,非常尴尬)
最后,他告诉我,他最想听到的是“new调用了构造函数和析构函数”,我赶紧道歉,“对不起老师,我太紧张了,没讲出来,其实这个点我是知道的”
第二题,类(class)、结构体(struct)和联合(union)的区别
1.我上来先把union和其他两个区分开来,说class和struct共同点挺多的,但是union和另外两个差别太大,除了写起来格式很像,没啥共同点,union最大的特点是它某个成员可以不确定,然后我讲了一下十字链表表示稀疏矩阵时union的运用。
2.class是C++里独有的,是C++面向对象特性的重要体现之一。三者都是C/C++共有的(废话)
3.然后我发了一个暴论“结构体是一种特殊的类”,并坦言“我以前好像在某个技术论坛上看过这句话”(当时真怕他继续深入问下去)。C++里,class能有的,struct里也都允许拥有,比如说各种类型的成员,构造函数和析构函数。
4.struct默认成员是公有的,class则默认成员是私有的
应该没说全,但他最后还是放我走了
第三题,C和C++的区别
1.C是面向过程,C++是面向对象(不愧是我,大一学生都知道的常识,被我严肃的单独列为一点)
2.C++里添加了new和delete,是malloc和free的升级版本。
3.C++有string类标识字符串,而C里只能用char类型数组表示字符串
4.C++里有强大的STL库,各种封装好的数据结构拿过来直接用就好了,C语言必须自己动手丰衣足食。
5.一入门打印hello world时用的头文件不一样,一个是iostream,一个是stdio.h(我可真不知羞耻)
6.C++里有函数重载
7.C++添加了“引用”,还有关键词auto,nullptr等等
其实我还能说很多,但是C++的很多新增东西,我只知道名字和概念,不深入了解,真怕他打断并深入问
应该还是没说全,但他还是放了我一马
第四题,浅拷贝和深拷贝的区别
string str=”hello world”; string str(”hello world”);
的区别,也就是拷贝初始化和直接初始化的区别(前者需要先构造一个字面量字符串”hello world”,在拷贝给s,后者直接赋值)
后来在面试官的引导下发现自己背错地方了T﹏T,然后改口:
浅拷贝只是拷贝一个指针(头指针),并没有新开辟一个地址,拷贝的指针和原来的指针指向同一块地址。其余剩余的内容,自己根据头指针按序寻址;
深拷贝不仅拷贝值,还开辟出一块新的空间用来存放新的值
勉强过关
第五题,谈一谈const类型的引用,这个我直接破防了。
我说我知道两种const类型的指针以及他们的区别,我也知道指针和引用的区别,但congst类型引用俺是真的想不起来了。(在他打断我之前,我还真给他背了背指针和引用的区别)
第六题,简要说明C++的内存分区
这块我没准备,吓坏了,机智的我假装电话信号不好,让他再说一遍问题,然后他接着补充“比如堆区,栈区,静态变量区,全局变量区(global)”
我方寸大乱,开始口胡,堆区就是new和malloc申请内存的区,可以释放和析构。栈区就是我们大多数情况下声明变量的区。静态变量区?是static吗?这个我知道(然后开始给他背诵static的特性:文件独有,对其他文件隐藏;可以记录被函数修改过的值;直接初始化为0或者空指针)。全局变量区?这个我有点忘记了。。。。(后来才发现静态变量和全局变量是一个意思,泥马)
其实总共六个区,我只说了三个。这也是老八股了,我这个答得太差了,具体参考链接
https://chenqx.github.io/2014/09/25/Cpp-Memory-Management/
最后,让我问他两个问题,我随便问了两个,结束面试。
当晚,Hr问我能不能来实习,能来的话就提offer了。
第三天的上午收到录用通知邮件。
全部评论
(22) 回帖