C++基础闯关100题,你能闯多少?2021超硬核大厂高频面试题腾讯云开发者社区

今天我整合了2021年100道大厂高频C++基础面试题,里面包含了C++很多基础知识点,干货满满。因内容较多,篇幅较长,所以会分成上下两篇讲解,强烈建议小伙伴们收藏!

下面我们一起来测验下,大家一起看看能闯多少关?

main函数执行之后:

voidtest(int*p){inta=1;p=&a;cout<

可以实现用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。

有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员,从而实现多态。

注意:构造函数不能为虚函数,但是析构函数可以为虚函数,并且虚析构函数可以防止父类指针销毁子类对象时不正常导致的内存泄漏。

相同点:

不同点:

const:

//i可以是int型或者constint型voidfun(constint&i){//...}static:

顶层const:指的是const修饰的变量本身是一个常量,无法修改,指的是指针,就是*号的右边。

底层const:指的是const修饰的变量所指向的对象是一个常量,指的是所指变量,就是*号的左边。

使用命名的强制类型转换函数const_cast时,只能改变运算对象的底层const。

constinta;intconsta;constint*a;int*consta;15、简单介绍内存池?内存池是一种内存分配方式。通常我们习惯直接使用new、malloc申请内存。

这样做的缺点在于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。

内存池则是在真正使用内存之前,预先申请分配一定数量、大小相等(一般情况下)的内存块留作备用。

当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是,使得内存分配效率得到提升。

intmain(intargc,charconst*argv[]){constchar*str="name";sizeof(str);//取的是指针str的长度,是8strlen(str);//取的是这个字符串的长度,不包含结尾的\0。大小是4return0;}19、简单描述内存泄漏?内存泄漏一般是指堆内存的泄漏,也就是程序在运行过程中动态申请的内存空间不再使用后没有及时释放,导致那块内存不能被再次使用。

假设数组inta[10];int(*p)[10]=&a;23、虚函数与纯虚函数的区别?24、数组名和指针(这里为指向数组首元素的指针)区别?数组名不是真正意义上的指针,可以理解为常指针,所以数组名没有自增、自减等操作。

当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作,但sizeof运算符不能再得到原数组的大小了。

宏定义在预处理的时候进行简单的字符串替换,而内联函数在编译时在每个调用内联函数的地方将函数展开,这样不用使内联函数占用栈空间,提高效率。

宏定义没有类型检查,但是内联函数还是具有函数的性质,有参数以及返回值。

都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。

野指针,指的是没有被初始化过的指针。

intmain(void){int*p;std::cout<<*p<

悬空指针,指针最初指向的内存已经被释放了的一种指针。

intmain(void){int*p=nullptr;int*p2=newint;p=p2;deletep2;}此时p和p2就是悬空指针,指向的内存已经被释放。继续使用这两个指针,行为不可预料。需要设置为p=p2=nullptr。此时再使用,编译器会直接保错。

避免野指针比较简单,但悬空指针比较麻烦。c++引入了智能指针,C++智能指针的本质就是避免悬空指针的产生。

产生原因及解决办法:

野指针:指针变量未及时初始化=>定义指针变量及时初始化,要么置空。

悬空指针:指针free或delete之后没有及时置空=>释放操作后立即置空。

final:

当不希望某个类被继承,或不希望某个虚函数被重写,可以在类名和虚函数后添加final关键字,添加final关键字后被继承或重写,编译器会报错。例子如下:

classBase{virtualvoidfoo();};classA:publicBase{voidfoo()final;//foo被override并且是最后一个override,在其子类中不可以重写};classBfinal:A//指明B是不可以被继承的{voidfoo()override;//Error:在A中已经被final了};classC:B//Error:Bisfinal{};override:

当在父类中使用了虚函数时候,你可能需要在某个子类中对这个虚函数进行重写,以下方法都可以:

classA{virtualvoidfoo();}classB:publicA{voidfoo();//OKvirtualvoidfoo();//OKvoidfoo()override;//OK}如果不使用override,当你手一抖,将foo()写成了foo()会怎么样呢?

结果是编译器并不会报错,因为它并不知道你的目的是重写虚函数,而是把它当成了新的函数。

如果这个虚函数很重要的话,那就会对整个程序不利。

所以,override的作用就出来了,它指定了子类的这个虚函数是重写的父类的,如果你名字不小心打错了的话,编译器是不会编译通过的:

再free一次时,由于堆中的内容已经是无效的东西,所以就会出错。

不过,有的编译器在free时并没有清理堆中的内存,有时你对它free两次也不一定出错。不过这是一个很大的隐患,在实际写代码中千万要注意避开这点。

浅拷贝:

深拷贝:

无参构造函数,析构函数,拷贝构造函数,重载赋值运算符函数。

volatile关键字告诉编译器该关键字修饰的变量是随时可能发生变化的。

每次使用它的时候必须从内存中取出它的值,因而编译器生成的汇编代码会重新从它的地址处读取数据放在左值中。

如果该变量是一个寄存器变量或者表示一个端口数据或者是多个线程的共享数据,就容易出错,所以说volatile可以保证对特殊地址的稳定访问。

由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。

#includeusingnamespacestd;classParent{public:Parent(){cout<<"Parentconstructfunction"<

重载是指在同一范围定义中的同名成员函数才存在重载关系。

主要特点是函数名相同,参数类型和数目有所不同,不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数,重载和函数成员是否是虚函数无关。

classA{...virtualintfun();voidfun(int);voidfun(double,double);staticintfun(char);...}重写(覆盖)(override):重写指的是在派生类中覆盖基类中的同名函数,重写就是重写函数体,要求基类函数必须是虚函数且:

//父类classA{public:virtualintfun(inta){}}//子类classB:publicA{public://重写,一般加override可以确保是重写父类的函数virtualintfun(inta)override{}}重载与重写的区别:

隐藏(hide):隐藏指的是某些情况下,派生类中的函数屏蔽了基类中的同名函数,包括以下情况:

//父类classA{public:voidfun(inta){cout<<"A中的fun函数"<

#includeusingnamespacestd;classStudent{public:Student(){//默认构造函数,没有参数this->age=20;this->num=1000;};Student(inta,intn):age(a),num(n){};//初始化构造函数,有参数和参数列表Student(constStudent&s){//拷贝构造函数,这里与编译器生成的一致this->age=s.age;this->num=s.num;};Student(intr){//转换构造函数,形参是其他类型变量,且只有一个形参this->age=r;this->num=1002;};~Student(){}public:intage;intnum;};intmain(){Students1;Students2(18,1001);inta=10;Students3(a);Students4(s3);printf("s1age:%d,num:%d\n",s1.age,s1.num);printf("s2age:%d,num:%d\n",s2.age,s2.num);printf("s3age:%d,num:%d\n",s3.age,s3.num);printf("s2age:%d,num:%d\n",s4.age,s4.num);return0;}//运行结果//s1age:20,num:1000//s2age:18,num:1001//s3age:10,num:1002//s2age:10,num:100240、静态变量什么时候初始化?好了,今天就到这里,我们就先整理前40道C++基础闯关,大家答对了多少道呢?明天我们继续努力!

THE END
1.C++计算机等级考试试题及答案C++计算机等级考试真题及答案2004年9月全国计算机二级C++考试真题及答案(Word版) 无忧考网计算机等级考试频道整理发布2004年9月全国计算机二级C++考试真题及答案(Word版),欢迎浏览,仅供参考。2020-06-08来源:无忧考网 历年全国计算机等级考试二级C++笔试填空真题答案(文字版) 填空题顺序 DEBFCA 单元 主键 D 3 1217 0,9 4 20,0 i-1 doublehttps://www.51test.net/ncre/cpp/zhenti/
2.C/C++程序设计c++程序设计考试卷C/C++程序设计 XXXX大学202X学年X季学期(试卷) 一、填空题(本大题共8小题,每空2分,共20分) 1、( )一个变量时,不会为变量分配存储空间。 2、函数的存储类型为( )时,只能在定义该函数的文件中使用该函数。 3、若有数组int a[4][3] = {1,8,3,12,5,6,25,8}; 则数组a中值最大的数据元素为(https://blog.csdn.net/workflower/article/details/144304476
3.万字详解我今年经历的腾讯LinuxC++笔试/面试题及答案今年有位学弟秋招时面了腾讯的Linux C/C++后端开发岗,一共三轮技术面,他记录了一些比较经典的面试问题,事后跟我分享了一下,确实记得很清楚,详细总结了自己的答案,今天分享一下他的笔记。 不得不说,腾讯确实是C++生态最好的公司了,我以前待过的百度也还可以,现在待的字节则完全是Go的天下了。。。 他的题很多https://www.eet-china.com/mp/a192911.html
4.C++笔试题目大全(笔试宝典)(不断完善中)51CTO博客15 题目的解答请参考《 C++ 中 extern “C” 含义深层探索》注解: 几道c 笔试题 ( 含参考答案 ) 1. What is displayed when f() is called given the code: class Number { public: string type; Number(): type( “ void ” ) { } explicit Number(short) : type( “ short ” ) { } https://blog.51cto.com/u_4296776/5946933
5.Java面试笔试题大汇总(最全+详细答案)本篇文章来自一位很资深的前辈对于最近java面试题目所做的总结归纳,有170道题目 ,知识面很广 ,而且这位前辈对于每个题都自己测试给出了答案 ,如果你对某个题有疑问或者不明白,可以电脑端登录把题目复制下来然后发表评论,大家一起探讨,也可以电脑端登录后关注我给我发私信,我们一起进步 ! 以下内容来自这位前辈 https://m.wang1314.com/doc/webapp/topic/13816802.html
6.全国计算机等级考试考试中心笔试试题及答案汇编:二级CC++Java《全国计算机等级考试考试中心笔试试题及答案汇编:二级C、C++、Java和Access(2002-2005)——全国计算机等级考试系列》,作者:全国计算机等级考试考试中心笔试试题及答案汇编:二级C、C++、Java和Access(2002-2005)——全国计算机等级考试系列教育部考试中心 编著,出http://m.dangdang.com/touch/product.php?pid=9164260
7.电子笔试题(华为面试题) ]IT 知名企业常见面试题实例与详解 一、 通用面试例题分析 1. 在学校里你学习了哪些普天 C++笔试题 1.实现双向链表删除一个节点 P,在节点 P 后插入一个节点,写出这两个函数。 2.写网通笔试题 选择题(每题 5 分,只有一个正确答案) 1.中国 1 号信令协议属于 的协议。 A ccs Bhttps://doc.mbalib.com/view/6cfbfd8daacca04e5688c3fe6c81f690.html
8.C/C++笔试题(精选6篇)篇3:C/C++笔试题 关键词:递归算法,递归函数,汉诺塔问题,函数调用 递归(Recursion) 是一种有效的算法设计方案。递归算法的目的就是用一种普遍的统一规律来解决步骤繁多的问题, 也正是因为如此, 它是数据结构中一个“杀伤力”很大的算法, 数据结构中的很多问题利用它可以清晰简洁地解决, 由于递归算法涉及到数学归纳https://www.360wenmi.com/f/file5904r5x5.html
9.10道阿里Java/C++笔试真题你能做对几道?3道就赢了80%的竞争者(含整理了几道阿里巴巴真题,来试试自己水平有多厉害吧,每题还有答案和详细解答哦。 1、有个特殊的餐厅,对客人的要求是如果要离开餐厅一定要看下餐厅内有没有比你迟进来的人,一定要所有比你迟进来的人离开后你才能离开,有一天甲,乙,丙,丁四个客人先后进入了这家餐厅,那么他们离开的顺序不可能是: https://www.jianshu.com/p/22da5bcf672f
10.送你一个励志故事——涵盖20多所互联网公司的校招C++面经而且由于非科班同学对于大部分东西都是第一次接触,本身没有一个特别好的框架或者概念,往往不知道这些知识的内在联系与实际应用场景,不要担心,先安心扩展自己的知识宽度,在慢慢将这些知识融会贯通的时候,自然而然你自己就会有答案,甚至你会在笔试面试或者与同学的交流中得到答案。顿悟的前提一定是大量知识的积累。https://www.nowcoder.com/discuss/55353