公元9102年11月28日,清小C心情兴奋而忐忑
昨天他收到了某互联网巨头公司的通知
今天他就要去面试了!
昨晚他就上网搜索了好多面试注意事项
可谓万事俱备
不过他唯一有点担心的是他在简历里写了……
其实他也不知道怎样才算精通C++
不过本着“听过=了解,用过=熟悉”的原则
何况他还在书店里看过
《30小时精通C++》的封皮
那么写自己“精通C++”,不是问题!
来到面试的地点
面试官是个脑袋锃亮的大叔
他微笑着让清小C坐下
翻起了他的简历
面试官
呦呵,你这里写的是精通C++是吧?
嗯…
(心里慌得不行,不会要露馅吧?)
(露出了诡异的微笑)那给你3分钟,先写个模板元编程实现的编译期堆排序吧。
???
清小C露出了黑人问号脸:???
但也只能硬着头皮在纸上写下了:
#include
using namespace std;
int main(){
(中间不会了)
return 0;
}
看来你不太懂模板啊,那我们来点简单的。来说说你觉得C和C++有什么区别吧。
区别…在于艹的个数。
C++:C艹,
by the way,
C#:C艹艹。
嗯哼?
开个玩笑。
大概,C++就是带类的C吧…
哎,小伙子,你这样不行啊。建议你以后写简历,就写精通VS的安装与卸载,精通C++的拼写,精通Windows系统的开关机,这样真实且像你。
嘤嘤嘤……
从你刚进来,你的秀发就已经出卖了你。你看,要像我这样的发型,说自己精通C++才有人信嘛,诶,等等,我发型呢…没事,这不重要。让我来告诉你C和C++的一些区别吧。以下是一些知识点,快拿小本本记下来。
~小本本:
1.C语言诞生得比较早,当时的人们还习惯于汇编语言,而且也还没有比较统一、通用的操作系统,因此C语言可以看作是“高级的汇编语言”,比较贴近底层硬件,其目标就是比汇编语言更方便、易懂。
C++大大提高了抽象层次,支持模块化编程,有很多设计模式可以使用,提高了程序员的效率。而且支持泛型程序设计,还不会离硬件太远,非常适合用来写一些基础架构软件和大型软件。
2.C是面向过程的语言,而C++是面向对象的语言。C++中除了类与对象、继承、多态等OOP语言必备的内容,还支持模板、重载、异常处理等,还有一个功能强大的标准模板库STL。当然C++也支持C风格,也可以写面向过程的代码。
3.在动态内存管理上,C语言是通过malloc和free来进行堆内存的分配和释放,而C++是通过new和delete来管理堆内存的。
具体来说:
(1)malloc只负责开辟内存,用户需要自己初始化;而new不但开辟内存,还可以进行初始化。
(2)malloc函数开辟内存需要传入字节数,返回值需要强制转换成指定类型的地址;而new是运算符,开辟内存时需要指定类型,返回指定类型的地址,不需要进行强制转换。
(3)malloc开辟的内存都是通过free来释放的;而new出来的释放对应用的是delete,如果是数组,就用delete[]。
(4)malloc开辟内存失败返回NULL,而new开辟内存失败会抛出bad_alloc类型的异常。
4.C++比C多了一个类作用域。此外,C++支持namespace名字空间,可以由用户自己定义新的名字空间作用域,避免全局的名字冲突问题。
5.输入输出方式不一样。C的printf/scanf,和C++的cout/cin,前者是C的库函数,后者是ostream/istream类的对象。
(喝了一口水,说道)说了那么多,让我们举个例子看看。就比如说,有个任务,要造出一辆汽车,并把它开进车库。这时候用C和C++就很不一样。你先说说你打算怎么做吧。”
太easy了,一共四步。造车,打开车库,把车开进去,关上车库。
咳…咳…算了,你别再说话了。让我带着你看看用C和用C++的区别,编程时要善于和程序语言“对话”。就像这样。
C是个高冷的DIY狂人,态度较为冷淡。如果你痴迷于DIY,什么都想靠自己做,我们一般只会用3个字来形容——C语言。不过当年他们大佬,在记事本里,拿机器语言写程序,那我用C写这么个小东西,不是问题。
VS,启动!
Hi,C语言。我需要构造一辆汽车,并把它放进车库。
C
哦。
你能帮我做吗?
C
哦。
那…怎么弄出一辆汽车呢?
C
DIY.
(你只好百度一下,发现要malloc一片内存)
我要用malloc函数申请一块内存放汽车啦。
C
哦。
然后是构造汽车了,怎么办呢?
C
你猜。
(于是你去翻阅了《汽车是如何造成的》)
我已经定义了一个汽车的数据结构,
然后呢?
C
继续猜。
好吧,我再照猫画虎,
构造一个车库吧。
C
哦。
(于是你又去翻阅了《车库是如何建成的》)
车库也构造出来了呢,现在你帮我把汽车放进去吧。
C
哼。
(经过一通搜索,你终于找到了正确的方法)
好吧,都放进去了。现在输出一下看看。
C
烫烫烫烫烫…
哼,我去找C++玩了。
C++比较年轻,平易近人。
C艹,帮我个忙好吗?
C艹
滚。
(说好的平易近人呢?)
dbq,尊敬的C++先生,帮我构造一辆汽车并放进车库好吗?
C艹
好的呀。我这里有好多祖传的汽车类可以给你继承,有丰田、奥迪、宝马…你要是要迈巴赫、兰博基尼啥的也有啊。只要你认他们为爸爸,你就拥有了他们的一切,哦,除了构造函数和析构函数外。而且你还可以认好多好多爸爸…然后你还可以在此基础上自由发挥,弄点你自己的玩意出来。就好比,虽然爸爸已经很强大,但你总也得靠自己做点事情…
emmm,我还是喜欢朴实无华一点的,随便来个国产牌子的汽车类吧,顺带车库类也随便来一个就行。
C艹
ok.用new运算符来申请一块动态内存哦。
好的,那现在来构造吧。
C艹
你可以自己选择车型、最快时速、车身长宽、车重…这些参数,对了你有喜欢的颜色吗?可以直接上色哦,亲。
呃…
(经过困难的选择后,你终于构造出了汽车和车库)
现在怎么放进去呢?
C艹
我选的这个车库类里有个AddCar函数,有接口的,你可以直接用。但是我没法告诉你它是怎么操作的。
太好了,我正好不想知道。
C艹
编译运行,我的速度极快呢。呃…等等,怎么报了100个错误…这是你的问题,你自己解决。
“写bug三分钟,debug三小时”什么的最喜欢了!
三小时后,一辆国产的、最快时速200km/h、车身长4.5米、宽1.8米、重1.2吨、黑色的…红旗H5型小汽车就被放进了某国内建筑公司设计的、位于北京的、占地面积约为50平米…的小车库里。
好是好,就是太多选择了也是烦恼啊。我再去找找Python看。
Python,帮我把汽车放进车库吧。
Python
直接import这个“开车进库”的模块,然后run即可。
哇,这么厉害的吗。给Python倒一杯卡布奇诺好吧,开始你的编程秀。
半天后
小老弟,你怎么回事?Python你快点啊,这你也要弄半天吗?…
Python
哼,慢有慢的好…
再见。
(你又回到C那里,摆弄一番后,不禁感叹:)
Python真香!
在被各种语言摩擦了一番后
清小C决定去找大佬求助
清小C气喘吁吁地找到两位大佬
瘫坐在椅子上
清先生,您好。
有什么事我们能帮到您?
我要说的事
(停顿了一下)
你们千万别害怕。
(两大佬战术后仰)
清先生,我们是大佬。
我们不会怕。
我刚才,
又用C++写了3个小时Bug,
还找不出哪里错了。
C++是哪一位?
不是哪一位,
就是那个面向对象的,
支持模板、重载、异常处理的,
自带标准模板库的C++啊!
大佬B在纸上写了一个C,并展示
比这多点儿。
大佬B在C后面加上了#,再展示
比这少点儿。
大佬B把纸转180°
又加了一竖
后面又写了个几个字母
(Python)
比这速度快点。
大佬A拿过纸
写下了加瓦
(Java)
(无奈摊手)C++啊,就是那种抽象程度很高的、程序猿都爱用的C++啊。它说我编程技术菜,试问谁不知道?它疯狂地给我报错,不给我编译运行,我还看不懂错哪了,每次都得花3小时以上看几行代码的bug…
大佬B忍不住笑了
你笑什么?
我想起高兴的事情。
什么事?
我是项目经理,不用自己写代码。
大佬A也忍不住噗嗤一笑
你又在笑什么?
我也是项目经理。
你们都是给好多程序猿提要求的?
对…对
喂!我再重申一遍!
我没在开玩笑!
对…对…好…呵呵哈哈哈哈…
(冷静下来)我们言归正传啊,你刚才说的这个C++,它好玩吗?
它不是好不好玩的问题。它真的是那种,那种很少见的那种,每次编译都给你报几百个错误,看着你debug几个小时,de到忘乎所以、飘飘欲仙、最后头发都没了才肯罢休…
啊哈哈哈哈哈…
你们欺人太甚!
一直笑我,都没停过。
清先生,我们受过专业的训练。不管多好笑,我们都不会笑。除非忍不住。
不如这样,清先生,您先回去把VS卸了。我们这边商量一下看怎么办,再通知您好吗?
行,那你们可得快点啊。
再多找几个大佬想想办法。
清小C刚走,大佬A&B……
啊哈哈哈哈哈…
清小C闻声回头
(保持严肃脸)清先生?
清小C简直不敢相信这一切
骂骂咧咧地走了…
走到楼梯上,突然打滑了…
于是,梦醒了,清小C呆呆地望着电脑上依旧不知从何下手的大作业和推送作业。世界归于平静,明天又将是新的一天……
【参考资料】
[1]CSDN:C++经典面试题 | malloc和new的区别?
https://blog.csdn.net/weixin_39411321/article/details/89311059
编辑 | 张灿睿、李保罗