C/C++面试经历(一)

目录

1. 说说你对C与C++的认识? 

2. 说说C++的三大特性?

3. 说说C++的重载?

4. C语言为什么不支持重载?

5. 说说类的默认成员函数?

6. 类的构造函数为什么不支持虚函数?

7. 说说你对指针和引用的理解?

8. 说说你对栈与堆的理解?

9. 说说map和unordered_map的区别?

10. 说说哈希和哈希碰撞?


1. 说说你对C与C++的认识? 

C语言是更偏底层的面向过程编程语言,C语言程序员需要了解并认识系统级的接口,并且能够熟练的对系统资源进行分配和调度。

C++是基于C语言的面向对象编程语言,C++程序员需要有抽象思维能力,将实际的问题转换为一个对象模型从而解决问题。

总的来说,C++是兼容C语言的,并且对C语言做了一些封装和扩展,从而能更便捷的实现编码。

2. 说说C++的三大特性?

C++的三特性分别是封装、继承和多态。

封装是将属性和操作封装在一个类中,隐藏内部的实现过程,只对外提供必要的接口,提高代码的安全性。

继承是指一个类可以通过继承另一个类的属性和方法来扩展自己的功能,提高代码的重用性,增加了类与类之间的耦合性。

多态是在继承的基础上,让一个接口能够实现多种的功能,通过父类指针或引用调用子类的接口,增加了接口的重用性。

3. 说说C++的重载?

C++的重载是指在同一个作用域内,对一个函数或者运算符进行多种定义,使其能够通过不同的参数类型或参数个数实现不同的功能。

运算符重载包括关系运算符、下标运算符、输入输出运算符重载,对某个类的小括号进行重载,可以使某个类变为仿函数。

4. C语言为什么不支持重载?

无论是C语言还是C++程序在从源代码生成可执行程序的过程中,都会经过预处理、编译、汇编、链接四个步骤,而C语言不能支持重载但是C++能够支持重载的原因就在链接这个步骤上。

在链接时,会生成符号表,C语言的设计存在缺陷,符号表里面的函数名就是函数名本身,当多个相同的函数名被定义的时候,在链接这个步骤相同的函数名不同的参数也是一样的命名,就会产生冲突而报错。

但是C++通过g++进行编译链接时在符号表中对于函数的命名规则是不一样的,C++符号表中的函数名由其函数名本身和参数构成,在链接这个步骤相同的函数名不同的参数就会在符号表中有不同的命名。

5. 说说类的默认成员函数?

C++的6大默认成员函数分别是构造、析构、拷贝构造、赋值运算符重载、取地址运算符重载和const修饰的取地址运算符重载。

6. 类的构造函数为什么不支持虚函数?

调用虚函数需要维护一张虚函数表,每一个拥有虚成员函数的类都有一个指向虚函数表的指针。

从存储角度来说,对象通过虚函数表里存储的虚函数地址来调用虚函数,但是虚函数表是在构造函数中进行初始化。当我们new一个对象的时候,第一步是申请空间,第二步便是调用构造函数,此时虚函数表不可能存在,故无法让构造函数作为虚函数从而通过虚函数表调用。

从使用角度来说,虚函数的调用是在信息不全的条件下,能使重载的函数得到对应的调用。要创建一个对象,需要知道一个对象的确切类型,因此构造函数不能被定义为虚函数。

7. 说说你对指针和引用的理解?

指针是指向一个数据地址的变量,存放的是数据的地址信息。

引用是一个数据的别名,通过对某个数值的引用进行修改,这个数值本身也会修改。

对比来说,指针可以为空、可以改变指向、可以有多级,别名不能为空且必须初始化、不能改变指向、只有一级,指针的自增自减是表示指向下一个或上一个同类型数据的地址,引用的自增自减是让所指向的变量的值进行自增自减操作。

8. 说说你对栈与堆的理解?

从内存管理角度来说,栈和堆处于内存的不同存储区域,栈区由操作系统自动分配,存储局部变量,堆区由程序员通过new或者malloc接口申请空间做资源存储,当资源使用完毕需要程序员主动释放,否则会造成系统资源浪费,通过free接口释放资源的时候还要注意野指针问题。

从数据结构角度来说,栈是连续的存储空间结构,支持随机访问,遵从“先进后出”规则,程序的执行也是通过函数栈帧的实现的,堆是完全二叉树结构,通过堆的调整策略将最值存入堆顶,常用于Top K的算法。

9. 说说map和unordered_map的区别?

map和unordered_map都是STL封装的容器,存放的数据是KV键值对。

map是通过对红黑树的封装实现的,红黑树对数据的增、删、查、改都有着非常高的效率,红黑树数据插入时能够根据键值自动排序。

unordered_map是通过对哈希表的封装实现的,哈希表的数据增、删、改的效率和红黑树差不多,但是哈希表的数据查询效率远高于红黑树,哈希表数据在插入时并不保证元素顺序,即无序的map。

总之,根据红黑树和哈希表性质的不同,在需要有序的遍历数据时,应选择map,当需要快速定位元素时,应选择unordered_map。

10. 说说哈希和哈希碰撞?

哈希也称散列,哈希算法是指将任意长度的输入通过散列运算得到一个固定长度的输出,该输出就是哈希值。

通常情况下,散列值的空间小于输入值的空间,并且哈希运算是不可逆运算,即可以通过原值得到哈希值,但是却不能通过哈希值推算出原值。

哈希碰撞是指两个不同原值,经过某种哈希运算之后得到了一个一样的哈希值,这就是哈希碰撞,也叫哈希冲突。

哈希碰撞的解决办法有开放寻址法和拉链法,开放寻址法也叫闭散列哈希表,拉链法也叫开散列哈希桶。

先说闭散列,当某个位置发生哈希冲突后,后面的数据就放到下一个位置,如果下一个位置也被占用了,则继续寻找直到找到空位置,闭散列的负载因子是已存入数据和空间容量的比值,当负载因子大于某个值时,会扩容并遍历已存入的数据重新映射。

再说开散列,将哈希冲突的值以链表的形式串起来存储在某个位置,负载因子同样是已存入数据和空间容量的比值,当负载因子大于某个值时进行扩容,并且改变已存入数据的指针使其重新映射。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】网络层协议 -- ICMP协议

文章目录 1. ICMP协议简介2. ICMP协议格式3. ping命令4. ping命令与端口号没有关系!!!5. traceroute命令 1. ICMP协议简介 ICMP(Internet Control Message Protocol,控制报文协议),用于在IP主机…

无代码集成明道云与更多应用连接

明道云是一个APaaS平台,可以帮助用户快速搭建个性化企业应用,用户不需要代码开发就能够搭建出用户体验上佳的销售、运营、人事、采购等核心业务应用,打通企业内部数据,也能够通过API和Webhook和其他系统对接。 场景描述&#xff…

libcurl网络库的函数接口使用

文章目录 1、libcurl简介2、libcurl的使用3、函数简介4、 curl_easy_setopt函数部分选项介绍5、curl_easy_perform 函数说明(error 状态码)6、简单实例,包含库文件,头文件即可 1、libcurl简介 libcurl是一个跨平台的网络协议库,支…

消息队列(3) -封装数据库的操作

前言 上一篇博客我们写了, 关于交换机, 队列,绑定, 写入数据库的一些建库建表的操作 这一篇博客中,我们将建库建表操作,封装一下实现层一个类来供上层服务的调用 , 并在写完该类之后, 测试代码是否完整 实现封装 在写完上述的接口类 与 xml 后, 我们想要 创建一个类 ,来调用…

Python的PyHook3插件使用详解

Python的PyHook3插件使用详解 上代码 上代码 def OnMouseEvent(event):print(MessageName:,event.MessageName)print(Message:,event.Message)print(Time:,event.Time)print(Window:,event.Window)print(WindowName:,event.WindowName)print(Position:,event.Position)print(W…

PAT 1065 A+B and C (64bit)

个人学习记录,代码难免不尽人意。 Given three integers A, B and C in (−263,263), you are supposed to tell whether AB>C. Input Specification: The first line of the input gives the positive number of test cases, T (≤10). Then T test cases foll…

uniapp实现支付宝菜单展开与收起

需求实现支付宝类似的效果: 思路: 1.首先建立展开收起按钮,这里使用的是uview里面的icon图标。 2.其次建立展开菜单内容,这里只演示了文本信息,后期引入首页应用。 3.最后写js逻辑,展开收起时改变盒子高度和…

基于STM32设计的出租车计费系统

一、项目介绍 在城市交通中,出租车是一种常见的交通工具。为了方便乘客和司机之间的交易,出租车计费系统被广泛应用于出租车行业。系统能够自动计算乘客的费用,提供准确、方便的计费服务,并且能够记录乘客的行驶数据,…

flink kafka消费者如何处理kafka主题的rebalance

背景: 我们日常使用kafka客户端消费kafka主题的消息时,当消费者退出/加入消费者组,kafka主题分区数有变等事件发生时,都会导致rebalance的发生,此时一般情况下,如果我们不自己处理offset,我们不…

面试题:HTTP Code码及应用场景分析

1xx 消息(临时响应) 属于临时相应,代表所发出的请求已经被接受,需要继续进行处理。只包含状态行和某些可选的响应头信息,并以空行结束。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器…

django处理分页

当数据库量比较大的时候一定要分页查询的 在django中操作数据库进行分页 queryset models.PrettyNum.objects.all() #查询所有 queryset models.PrettyNum.objects.all()[0:10] #查询出1-10列 queryset models.PrettyNum.objects.filter(mobile__contains136)[0:10] …

登陆校验解决前端success回调函数始终执行问题

有一串前端js登陆代码&#xff1a; sendRequest:function(){wx.request({url: http://localhost:8080/lf/login/2021/2021,method:POST,success:(res) > {console.log("测试通过")}})} 和后端代码&#xff1a; public Result<Students> logginById(PathVar…

python-opencv对极几何 StereoRectify

OpenCV如何正确使用stereoRectify函数 函数介绍 用于双目相机的立体校正环节中&#xff0c;这里只谈谈这个函数怎么使用&#xff0c;参数具体指哪些函数参数 随便去网上一搜或者看官方手册就能得到参数信息&#xff0c;但是&#xff01;&#xff01;相对关系非常容易出错&…

OpenAI将GPT-4设置为ChatGPT Plus付费用户的默认模型

OpenAI最近为ChatGPT引入了一系列新功能&#xff0c;这些更新旨在增强用户体验&#xff0c;提供更多指导和更多的功能。其中最显著的功能之一是将GPT-4设置为ChatGPT Plus付费用户的默认模型&#xff0c;这意味着付费订阅用户无需手动切换到其他公开可用的语言模型&#xff0c;…

机器学习深度学习——池化层

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——卷积的多输入多输出通道 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们…

1. Git基础知识

文章目录 Git基础知识一、集中式与分布式二、中心服务器三、工作流四、分支实现五、冲突六、Fast forward七、储藏&#xff08;Stashing&#xff09;八、SSH 传输设置九、.gitignore 文件十、Git 命令一览十一、和远端仓库交互 Git基础知识 一、集中式与分布式 Git 属于分布式…

vue3+antd——实现App.vue页面实时获取权限+用户信息的功能——基础积累

之前写过一篇文章关于vue3antd的框架模板&#xff0c;链接如下&#xff1a;http://t.csdn.cn/9dZMS 1.App.vue代码 <template><ConfigProvider :locale"locale"><ThemeProvider is-root v-bind"themeConfig" :apply-style"false&quo…

【单片机】51单片机,晨启科技,板子引脚对应关系

一般引脚: sbit beepP2^4; //将单片机的P2.4端口定义为beep.本口用于屏蔽上电后蜂鸣器响 sbit ledP1^0; //将单片机的P1.0端口定义为led&#xff0c;用于点亮LED-D1 sbit DIG1P0^0; //数码管位选1 sbit DIG2P0^1; //数码管位选2P10xFF;//初始化P1引脚全部置高&a…

【第一阶段】kotlin的when表达式

1.Java 的if /when是语句 kotlin的if/when是表达式&#xff0c;表达式是有返回值的 java中void是个关键字&#xff0c;Unit在kotlin中是个类 2.当使用when语句的时候必须有一个不满足的值即else: fun main() {var week:Int5val info when(week){1->"今天是星期一"…

Transformer学习笔记

Transformer学习笔记 前言前提条件相关介绍Transformer总体架构编码器&#xff08;Encoder&#xff09;位置编码&#xff08;Positional Encoding&#xff09;get_attn_pad_mask函数&#xff08;Padding Mask&#xff09;EncoderLayerMultiHeadAttentionScaledDotProductAttent…