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

在面试C++方面的工作时,经常会遇到各种面试题,这对应聘人员的知识掌握能力要求较高。本文将为大家带来的就是19道必须掌握的C++面试题,不要错过哦!

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

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

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

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

答:

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

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

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

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

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

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

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

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

序列式容器,其中的元素不一定有序,但都可以被排序。如:vector、list、deque、stack、queue、heap、priority_queue、slist;

关联式容器,内部结构基本上是一颗平衡二叉树。所谓关联,指每个元素都有一个键值和一个实值,元素按照一定的规则存放。如:RB-tree、set、map、multiset、multimap、hashtable、hash_set、hash_map、hash_multiset、hash_multimap。

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

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

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

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

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

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

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

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

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

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

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

一、堆栈空间分配区别:

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

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

二、堆栈缓存方式区别:

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

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

三、堆栈数据结构区别:

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

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

一、封装:

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

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

二、继承:

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

三、多态

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

答:选择、冒泡、快速、希尔、归并、堆排等。

1.快排:是冒泡排序的一种改进。

优点:快,数据移动少

缺点:稳定性不足

2.归并:分治法排序,稳定的排序算法,一般用于对总体无序,但局部有序的数列。

优点:效率高O(n),稳定

缺点:比较占用内存

1、malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

2、对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。

3、由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

4、C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

1.TCP面向连接,UDP面向无连接的

2.TCP有保障的,UDP传输无保障的

3.TCP是效率低的,UDP效率高的

4.TCP是基于流的,UDP基于数据报文

5.TCP传输重要数据,UDP传输不重要的数据

IOCP全称I/OCompletionPort,中文译为I/O完成端口。

IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序。

与使用select()或是其它异步方法不同的是,一个套接字[socket]与一个完成端口关联了起来,然后就可继续进行正常的Winsock操作了。然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以得到此完成端口。

A.同步

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。

按照这个定义,其实绝大多数函数都是同步调用(例如sinisdigit等)。

最常见的例子就是SendMessage。

该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。

当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者。

B.异步

异步的概念和同步相对。

当一个异步过程调用发出后,调用者不会立刻得到结果。

实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,或通过回调函数处理这个调用。

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

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

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

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

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

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

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

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

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

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

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

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

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

THE END
1.20190919数组&字符串&结构体&共用体&枚举这个宏返回的就是指向整个结构体变量的指针,类型是(type *)。 short*p=&(s1.c);structmystruct*pS=NULL;pS=container_of(p,structmystruct,c)//通过p来计算得到s1的指针 (1)作用:知道一个结构体中某个元素的指针,反推这个结构体变量的指针。有了container_of宏,我们可以从一个元素的指针得到整个结构体变量...https://www.jianshu.com/p/807de5183fb1
2.Windows7系统高阶鼠标调试详解在Windows 98中(至少Win98),OS内部对于加速度、速度缩放的多重计算会导致指针的分数移动,也就是说指针移动的计算结果不一定是整数。这一计算结果被分为整数和分数余数两部分,整数由结果取整得到,分数即不足一像素的余数部分,一般与整数同号。系统内部储存分数部分,并追加到下一次指针移动计算结果上。举例来说,比如...http://www.360doc.com/content/18/1228/21/31791761_805146796.shtml
1.C指针——知识点大全(详细,简洁,含例题)指针c前言:大家好,这里是YY;此篇博客主要是指针的知识点;包含【一二级指针】【字符指针】【指针数组】【数组指针】【以上知识的实际应用】【函数指针】【函数指针数组】 PS:创作不易,每个知识点都有例题或者图帮助理解;如果对你有帮助,希望能够得到您的关注,赞,收藏,谢谢! https://blog.csdn.net/YYDsis/article/details/130534787
2.一文让你不再害怕指针之C指针详解(经典,非常详细)C语言这篇文章主要给大家介绍了C指针的相关资料,文中介绍的很经典,非常详细,文中通过示例代码介绍的非常详细,对大家学习或者使用C指针具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧https://www.jb51.net/article/168671.htm
3.指针函数和函数指针(附实例详解)腾讯云开发者社区指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。 主要的区别是一个是指针变量,一个是函数。在使用是必要要搞清楚才能正确使用。 1、指针函数:带指针的函数,即本质是一个函数。函数返回类型是某一类型...https://cloud.tencent.com/developer/article/2030119
4.最详细的指针详解C语言从入门到精通指针 1.指针是什么? 指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是**内存地址**,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅...https://blog.51cto.com/u_15612474/5828245
5.数据结构实习报告(精选3篇)为实现上述程序功能需建立单向循环链表以存储此结构,出列操作的模块主程序模块循环链表的创建模块,申请一个空间将头指针和指针均指向第一个结点分配存储空间失败,子函数依次出列并释放结点的空间。https://www.oh100.com/bg/a/201610/477545144175.html
6.利用相机SDK采相转换至HImage机器视觉视觉检测设备从像素指针创建图像,即得到像素的内存指针(PixelPointer),已知图像的类型(ColorFormat)、尺寸(ImageWidth、ImageHeight)就可将其转化为HImage。 gen_image1适合于单通道图像转化,gen_image3转化需要分别知道RGB三个通道的指针,gen_image_interleaved转化需要知道图像的内存的总指针以及图像的格式。 https://www.0755vc.com/2841.html
7.比特币原理登链社区区块链技术社区2、单项不可逆运算,即已知 x 和 sha256函数可以算出 y 的值,但是已知y不能逆运算出x。3、计算结果不可预测,就是哈希值不能预测出回出现在某个区间内,如果想要得到一个哈希值处于某个区间范围内,没有什么好办法,只有一个一个输入x试过去。 Hash pointer(哈希指针)...https://learnblockchain.cn/index.php/article/5040
8.4指针变量的引用指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。 指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。 在C语言中, 变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。 https://cooc.cqmu.edu.cn/Course/KnowledgePoint/5008.aspx
9.this指针MicrosoftLearnthis 指针是一个编译器生成的指针,指向非静态成员函数中的当前对象。https://docs.microsoft.com/zh-cn/cpp/cpp/this-pointer