首页 > 编程语言 >原创 C++的校招的面试题,看看你能答对几个?

原创 C++的校招的面试题,看看你能答对几个?

时间:2023-06-23 11:35:54浏览次数:49  
标签:面试题 C++ 内存 new 校招 父类 分配 指针

嗨~大家好呀,最近后台有人问小谷,C++校招的话,需要了解哪些内容,大家知道的,小谷有求必应的,那么之后我就来周期性更新一下作为一名C++开发工程师要掌握的知识,本期主要介绍一下C++基础知识吧!

程序员

1、面向对象的三大特性:封装、继承、多态

封装:就是把客观事物封装成抽象的类,可以使某个属性只能被当前类使用,从而避免被其他类或对象进行操作——保证了安全性。也可以让使用者不必了解具体类的内部实现细节,而只需通过提供给外部的访问接口来访问类中的属性和方法——简化编程。

封装的意义:

保护或者防止代码(数据)被我们无意中破坏;

保护成员属性,不让类以外的程序直接访问和修改;

隐藏方法细节,简化编程。

用封装来实现高内聚,低耦合。

C++中可以给成员变量和成员函数定义访问级别public属性:

公开 public:属性和方法可以在类的内部使用,也可以被继承,也可以在类的外部使用

保护 protect:属性和方法可以在类的内部使用,可以被继承,但不可以在类的外部使用

私有 private:属性和方法可以在类的内部使用,不可以被继承,也不可以在类的外部使用

继承: 指的是可以让某个类型的对象获得另一个类型的对象的属性的方法,继承可以使得子类沿用父类的成员(属性和方法),而无需重新编写原来的类并且可以对父类的成员(属性和方法)进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承提高了代码的复用性和维护性。 

继承的特点:

子类可以继承父类非私有成员。

子类可以有自己特有的成员,并不会把父类的成员复制给子类,而去引用。

子类可以重写父类的方法,而重新定义了父类中的方法,叫做重写

子类可以在父类提供方法的基础上,额外新增一些功能。

子类无法继承父类的构造方法。

子类不能继承父类中不符合访问权限的成员。

多态:

 接口的多种不同的实现方式即为多态——接口重用!

多态是以封装和继承为基础的,一个类实例的相同方法在不同情形下有不同的表现形式,使不同内部结构的对象可以共享相同的外部接口。多态分为静态多态和动态多态。静态多态是通过重载和模板技术实现的,在编译期间确定;动态多态是通过虚函数和继承关系实现的,执行动态绑定,在运行期间确定。

2.类的访问权限:

private、protected、public 

3.内存分区:

全局区、堆区、栈区、常量区、代码区 

4.C++和C的区别: 

C++是面向对象的语言,而C是面向过程的语言; 

C++引入new/delete运算符,取代了C中的malloc/free库函数; 

C++引入引用的概念,而C中没有;

C++引入类的概念,而C中没有;

C++引入函数重载的特性,而C中没有 

5.堆和栈的区别:

分配和管理方式不同: 堆是动态分配的,其空间的分配和释放都由程序员控制; 栈是由编译器自动管理的,其分配方式有两种:静态分配由编译器完成,比如局部变量的分配;动态分配由alloca()函数进行分配,但是会由编译器释放;

产生碎片不同: 对堆来说,频繁使用new/delete或者malloc/free会造成内存空间的不连续,产生大量碎片,是程序效率降低; 对栈来说,不存在碎片问题,因为栈具有先进后出的特性;

生长方向不同: 堆是向着内存地址增加的方向增长的,从内存的低地址向高地址方向增长; 栈是向着内存地址减小的方向增长的,从内存的高地址向低地址方向增长;

申请大小限制不同: 栈顶和栈底是预设好的,大小固定; 堆是不连续的内存区域,其大小可以灵活调整。

6.malloc/free和new/delete的区别

malloc/free和new/delete

共同点是:

都是从堆上申请空间,并且需要用户手动释放。

不同的地方是:

1 malloc和free是函数,new和delete是操作符

2. malloc申请的空间不会初始化,new可以初始化

3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可。

4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型。

5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常。

6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。

7.指针与引用的区别

指针有自己的一块空间,而引用只是一个别名;

使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;

作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引 用的修改都会改变引用所指向的对象;

可以有const指针,但是没有const引用;

指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被改变;

指针可以有多级指针(**p),而引用止于一级;

指针和引用使用++运算符的意义不一样 

如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。 

8.浅拷贝和深拷贝有什么区别?

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享一块内存;

而深拷贝会创造一个相同的对象,新对象与原对象不共享内存,修改新对象不会影响原对象。

 9.静态内存分配和动态内存分配有什么区别?

静态内存分配是在编译时期完成的,不占用CPU资源;动态内存分配是在运行时期完成的,分配和释放需要占用CPU资源;

静态内存分配是在栈上分配的;动态内存分配是在堆上分配的;

静态内存分配不需要指针或引用类型的支持;动态内存分配需要;

静态内存分配是按计划分配的,在编译前确定内存块的大小;动态内存分配是按需要分配的;

静态内存分配是把内存的控制权交给了编译器;动态内存分配是把内存的控制权给了程序员;

静态内存分配的运行效率比动态内存分配高,动态内存分配不当可能造成内存泄漏。 

10.C++函数中值的传递方式有哪几种?

值传递、指针传递和引用传递 

11.list和vector区别:

list是由双向链表实现的,内存空间是不连续的。由链表的实现原理可知:

优点:插入和删除效率较高。只需要在插入的地方更改指针的指向即可,不用移动数据。

缺点:List查询效率较低,时间复杂度为O(n)

vector拥有一段连续的内存空间,并且起始地址不变,与数组类似:

优点:便于随机访问,时间复杂度为O(1),

缺点:因为内存空间是连续的,所以在进入插入和删除操作时,会造成内存块的拷贝,时间复杂度为O(n)。

12.覆盖和重载之间有什么区别?

覆盖是指派生类中重新定义的函数,其函数名、参数列表、返回类型与父类完全相同,只是函数体存在区别;覆盖只发生在类的成员函数中;

重载是指两个函数具有相同的函数名,不同的参数列表,不关心返回值;当调用函数时,根据传递的参数列表来判断调用哪个函数;重载可以是类的成员函数,也可以是普通函数。

好了本期C++基础内容就讲到这里了~其他内容我们下期见吧!

 

https://www.boxuegu.com/news/4664.html

 

标签:面试题,C++,内存,new,校招,父类,分配,指针
From: https://www.cnblogs.com/im18620660608/p/17498904.html

相关文章

  • 宇宙最全面的C++面试题v2.0
    作为一个后端人,是无论如何要对C++有一定了解底。很多同学都对C++有一定的抵触情绪,因为C++知识点繁杂全面,深度与广度俱在,准备面试需要很长的时间。本篇的主要目的是梳理知识脉络,挑选最精华的面试题,以飨读者,事半功倍!准备面试一定要有侧重点,标为❤属于高频考点,需要反复记忆。建议平......
  • C++/C 试题 (面试必看)
    本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。笔试时间90分钟。请考生认真答题,切勿轻视。一、请填写BOOL,float,......
  • C++ 复习要点
    本文总结一下C++面试时常遇到的问题。C++面试中,主要涉及的考点有 关键字极其用法,常考的关键字有const,sizeof,typedef,inline,static,extern,new,delete等等语法问题类型转换指针以及指针和引用的区别面向对象的相关问题,如虚函数机制等泛型编程的相关问题,如模板和......
  • 19道必须掌握的C++面试题
    在面试C++方面的工作时,经常会遇到各种面试题,这对应聘人员的知识掌握能力要求较高。本文将为大家带来的就是19道必须掌握的C++面试题,不要错过哦! 想要快速轻松掌握C++知识,请点击C++微课边学习边实践 问1:请用简单的语言告诉我C++是什么?答:C++是在C语言的基础上开发的一种面向......
  • c++内存分布之虚析构函数
    关于本文代码演示环境:VS2017+32程序虚析构函数是一种特殊的虚函数,可以知道,虚函数影响的内存分布规律应该也适用虚析构函数。看看实际结果。Note,一个类中,虚析构函数只能有一个。本文将展开单一继承和多继承两种情况结论1.虚函数表指针和虚函数表1.1影响虚函数表指......
  • c++中虚析构函数如何实现多态的、内存布局如何?
    作者:冯Jungle链接:https://www.zhihu.com/question/36193367/answer/2242824055来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。之前Jungle写过一篇文章《探究C++:虚函数表究竟怎么回事?》,主要通过测试代码来验证虚函数表的存在,进而说明C++的多态机制......
  • c++ 64位输出地址超过int类型使用longlong类型输出
    #include<iostream>usingnamespacestd;intmain(){intarr[10]={1,2,3,4,5,6,7,8,9,20};cout<<"整个数组所占内存空间为"<<sizeof(arr)<<endl;cout<<"每个元素所占内存空间为"<<sizeof(arr[0])<<endl;cout<<"......
  • C++面试八股文:override和finial关键字有什么作用?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第22面:(二师兄好苦逼,节假日还在面试。。。)面试官:C++的继承了解吗?二师兄:(不好意思,你面到我的强项了。。)了解一些。面试官:什么是虚函数,为什么需要虚函数?二师兄:虚函数允许在基类中定义一个函数,然后在派生类中进行重写(override)。二......
  • C++面试八股文:什么是左值,什么是右值?
    C++面试八股文:什么是左值,什么是右值?某日二师兄参加XXX科技公司的C++工程师开发岗位第16面:面试官:什么是左值,什么是右值?二师兄:简单来说,左值就是可以使用&符号取地址的值,而右值一般不可以使用&符号取地址。inta=42; //a是左值,可以&aint*p=&a;int*p=&42; //42是右......
  • 字节、百度、美团、腾讯技术面,面试题及答案分享(Android岗)
    字节(3轮技术面):一面:1.final2.类加载3.双亲委派机制,为什么要使用4.GC5.leackcanary6.hashmap7.concurrenthashmap8.事件分发9.handler算法:1.LeetCode61:旋转链表2.合并两个有序链表二面:1.final修饰int类型的变量能不能改变?怎么改变?2.反射可以改变这个int值吗?怎么改变?反射......