page contents

20道必须掌握的C++面试题

在面试C++方面的工作时,经常会遇到各种面试题,这时就考验应聘人员对知识的掌握情况了。毕竟这可是开启你职业生涯的一块敲门砖,本文将为大家带来20道必须掌握的C++面试题..........

attachments-2021-08-IHnIzHfK61285c7f697c6.png

在面试C++方面的工作时,经常会遇到各种面试题,这时就考验应聘人员对知识的掌握情况了。毕竟这可是开启你职业生涯的一块敲门砖,本文将为大家带来20道必须掌握的C++面试题,不要错过哦!

 

1:请用简单的语言告诉我C++ 是什么?

答:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性!

 

2CC++的区别?

答:c++c的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。

 

3:什么是面向对象(OOP)?

答:面向对象是一种对现实世界理解和抽象的方法、思想,通过将需求要素转化为对象进行问题处理的一种思想。

 

4:什么是多态?

答:多态是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态。

 

5:设计模式懂嘛,简单举个例子?

答:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

比如单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。

适用于:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

比如工厂模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

适用于:当一个类不知道它所必须创建的对象的类的时候;当一个类希望由它的子类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

 

6STL库用过吗?常见的STL容器有哪些?算法用过哪几个?

答:STL包括两部分内容:容器和算法。(重要的还有融合这二者的迭代器)

容器:存放数据的地方。比如array等。

STL中,容器分为两类:序列式容器和关联式容器。

序列式容器,其中的元素不一定有序,但都可以被排序。如:vectorlistdequestackqueueheappriority_queueslist

关联式容器,内部结构基本上是一颗平衡二叉树。所谓关联,指每个元素都有一个键值和一个实值,元素按照一定的规则存放。如:RB-treesetmapmultisetmultimaphashtablehash_sethash_maphash_multisethash_multimap


下面各选取一个作为说明。

vector:它是一个动态分配存储空间的容器。区别于c++中的arrayarray分配的空间是静态的,分配之后不能被改变,而vector会自动重分配(扩展)空间。

set:其内部元素会根据元素的键值自动被排序。区别于map,它的键值就是实值,而map可以同时拥有不同的键值和实值。

算法,如排序,复制……以及个容器特定的算法。这点不用过多介绍,主要看下面迭代器的内容。

迭代器是STL的精髓,我们这样描述它:迭代器提供了一种方法,使它能够按照顺序访问某个容器所含的各个元素,但无需暴露该容器的内部结构。它将容器和算法分开,好让这二者独立设计。

 

7:数据结构会吗?项目开发过程中主要用到那些?

答:数据结构中主要会用到数组,链表,树(较少),也会用到栈和队列的思想。


8const知道吗?解释其作用。

答:

1.const 修饰类的成员变量,表示成员常量,不能被修改。

2.const修饰函数承诺在本函数内部不会修改类内的数据成员,不会调用其它非 const 成员函数。

3.如果 const 构成函数重载,const 对象只能调用 const 函数,非 const 对象优先调用非 const 函数。

4.const 函数只能调用 const 函数。非 const 函数可以调用 const 函数。

5.类体外定义的 const 成员函数,在定义和声明处都需要 const 修饰符。

 

9:类的static变量在什么时候初始化?函数的static变量在什么时候初始化?

答:类的静态成员变量在类实例化之前就已经存在了,并且分配了内存。函数的static变量在执行此函数时进行初始化。

 

10:堆和栈的区别?堆和栈的生命周期?

答:

一、堆栈空间分配区别:

 

1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;

 

2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

 

二、堆栈缓存方式区别:

 

1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;

 

2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

 

三、堆栈数据结构区别:

 

堆(数据结构):堆可以被看成是一棵树,如:堆排序;

 

栈(数据结构):一种先进后出的数据结构。

 

11如何让局部变量具有全局生命期。

答:具体的生命期的概念我觉得我还要好好深入的学习一下,但是这个题目还算比较简单,即用static修饰就可以了,但是只是生命期延长,范围并没有扩大,除非把这个变量定义在函数体外的静态区,不过那样就变成全局变量了,仿佛不符合题目要求。

 

12:解释下封装、继承和多态?

答:

一、封装:

封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。

封装的意义在于保护或者防止代码(数据)被我们无意中破坏。

二、继承:

继承主要实现重用代码,节省开发时间。

子类可以继承父类的一些东西。

三、多态

多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

 

13:指针和引用的区别?

答:

1. 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用仅是个别名;

 

2. 引用使用时无需解引用(*),指针需要解引用;

 

3. 引用只能在定义时被初始化一次,之后不可变;指针可变;

 

4. 引用没有 const,指针有 const

 

5. 引用不能为空,指针可以为空;

 

6. “sizeof 引用得到的是所指向的变量(对象)的大小,而“sizeof 指针得到的是指针本身的大小;

 

7. 指针和引用的自增(++)运算意义不一样;

 

8. 指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

 

9.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

 

14:什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?你通常采用哪些方法来避免和减少这类错误?

答:用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。

使用的时候要记得指针的长度。

 

malloc的时候得确定在那里free.

 

对指针赋值的时候应该注意被赋值指针需要不需要释放.

 

动态分配内存的指针最好不要再次赋值.

 

15解释C++中静态函数和静态变量?

答:

(1)类静态数据成员在编译时创建并初始化:在该类的任何对象建立之前就存在,不属于任何对象,而非静态类成员变量则是属于对象所有的。类静态数据成员只有一个拷贝,为所有此类的对象所共享。

 

(2)类静态成员函数属于整个类,不属于某个对象,由该类所有对象共享。

 

1static 成员变量实现了同类对象间信息共享。

 

2static 成员类外存储,求类大小,并不包含在内。

 

3static 成员是命名空间属于类的全局变量,存储在 data 区的rw段。

 

4static 成员只能类外初始化。

 

5、可以通过类名访问(无对象生成时亦可),也可以通过对象访问。

 

16下你对内存的了解?

答:

1. - 由编译器自动分配释放

 

2. - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收

 

3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放

 

4.另外还有一个专门放常量的地方。- 程序结束释放

 

5 程序代码区,存放2进制代码。

 

在函数体中定义的变量通常是在栈上,用malloc calloc realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。

C++classstruct的区别与联系

a. 默认访问权限不同,C++中的class成员的默认属性是private ,而struct默认属性是public

b.struct 可以定义相应结构所需的成员函数以及成员变量以及函数,可以有private ,public属性,protected 属性。

d.使用场景:.1,从此后只使用 class 定义类(一般的);       2struct 只用来表示变量的集合(一般的),代表一个结构体;

c。使用方式:C++ 中的类支持声明和实现的分离,意义在于分两个角度来看待类,一个是声明的角度、一个是实现的角度:  1,在头文件中声明  1,类的使用方式;   2,在源文件中实现类; 1,类的实现细节;

 

17介绍一下模板和容器。如何实现?

答:可以说比较古老了,但是当前的泛型编程实质上就是模板编程。 它体现了一种通用和泛化的思想。 STL7种主要容器:vector,list,deque,map,multimap,set,multiset.

 

18C++中和C言中struct的区别

(1) c++中的类默认的成员是私有的,struct默认的是共有的。

(2) c++中的类可以定义成员函数,struct只能定义成员变量。

 

19程序什么时候应该使用线程,什么时候单线程效率高。

答:

1 耗时的操作使用线程,提高应用程序响应

 

2 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。

 

3 CPU系统中,使用线程提高CPU利用率

 

4 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。 其他情况都使用单线程。

 

20C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明?

答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern “C”修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。

 

 


以上就是20道必须掌握的C++面试题分享,希望对想要学习c++的学员能有所帮助。想要了解诶更多有关c++的其它知识也可关注六星社区网站。

  • 发表于 2021-08-27 11:35
  • 阅读 ( 795 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小柒
小柒

1312 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章