C++面试干货---带你梳理常考的面试题(二)

顾得泉:个人主页

个人专栏:《Linux操作系统》 《C++从入门到精通》  《LeedCode刷题》

键盘敲烂,年薪百万!


1.struct 和 class 区别

       1.默认访问权限:struct中的成员默认为public,而class中的成员默认为private。

       2.继承:struct默认为public继承,class默认为private继承。

       3.内存分配方式:struct以值类型(value type)方式分配内存,而class以引用类型(reference type)方式分配内存。

       4.默认构造函数:struct可以没有显式定义构造函数,默认提供一个无参构造函数;而class必须显式定义构造函数,不会默认提供无参构造函数。

       5.默认拷贝函数:struct默认提供浅拷贝构造函数和拷贝赋值运算符;而class默认提供浅拷贝构造函数和拷贝赋值运算符,同时还可以通过定义拷贝构造函数和拷贝赋值运算符进行深拷贝。

在使用时,可以根据具体的需求选择使用struct还是class。通常情况下,如果仅仅需要一个简单的数据结构,可以使用struct,而如果需要更多的功能和灵活性,可以使用class。


 2.声明和定义的区别

       声明(Declaration)是指在程序中引入一个标识符(变量、函数、类型等),以便在后续的代码中使用它。声明告诉编译器或解释器标识符的存在和类型,并为它分配内存空间(对于变量),但不为其赋初值。声明的主要作用是让编译器或解释器知道标识符的存在,从而可以在后续的代码中使用它。

       定义(Definition)是对一个标识符进行声明的同时,给它赋予一个初值或具体的实现。定义既包括声明的作用,也包括为标识符分配内存空间和赋初值(或实现)的作用。定义的主要作用是在程序中为标识符分配内存空间并赋予初值或实现,以便可以进行后续的操作。

       总结来说,声明是引入一个标识符以供后续使用,定义是在声明的同时分配内存空间并赋初值或实现。声明只提供标识符的信息,而定义还提供了标识符的具体值或实现。


 3.继承和多态区别与联系

       继承是指一个类从另一个类获取属性和方法的过程。在继承中,一个类可以继承另一个类的属性和方法,并且可以在其基础上进行扩展或修改。子类继承父类的属性和方法,可以通过继承来实现代码的重用,减少重复编写的工作量。

       多态是指同一个方法可以在不同的对象上使用,并且得到不同的行为结果。多态性允许使用父类类型的变量来引用子类类型的对象,通过向上转型,我们可以实现统一的调用方式,但表现出不同的行为。多态是实现代码的灵活性和可扩展性的重要手段。

       继承和多态之间的联系在于,多态是建立在继承的基础上的。只有在存在继承关系的类之间,才能使用多态。通过继承,子类可以继承父类的方法,并且可以在子类中重写这些方法以实现多态。

       继承和多态之间的区别在于,继承是一个类从另一个类获取属性和方法的过程,而多态是同一个方法可以在不同的对象上产生不同的行为结果。继承是一种静态的关系,它在编译时期就确定了。而多态是一种动态的关系,它在运行时期确定。


4.C++ 11 新特性

1.自动类型推导(auto):可以根据初始化表达式的类型自动推导出变量的类型。

2.简化的迭代器循环(range-based for loop):可以更方便地遍历容器中的元素。

3.初始化列表(initializer list):可以用一组值初始化数组、容器等。

4.移动语义(move semantics):引入了右值引用和移动构造函数,可以有效地避免不必要的拷贝操作,提高性能。

5.lambda表达式:可以在代码中定义匿名函数,方便编写简短的、局部的函数对象。

6.函数对象的默认参数(default function arguments):可以为函数对象的参数指定默认值,简化函数调用。

7.右值引用(rvalue references):可以通过引用绑定到临时对象,进一步增加移动语义的应用场景。

8.合并类(unified class):引入了类的新特性,如类静态断言、类模板别名等。

9.并发编程支持(concurrency support):引入了线程库、原子操作等,方便编写多线程程序。

10.正则表达式支持(regular expression support):引入了正则表达式库,方便进行字符串匹配和替换操作。


5.static 的作用

1.声明静态变量:在类中声明的静态变量,所有实例对象共享同一份副本,不会随实例对象的创建和销毁而改变。

2.定义静态方法:静态方法不依赖于实例对象,可以直接通过类名调用,无需创建对象。

3.创建静态代码块:静态代码块在类加载时被执行,用于初始化静态变量或执行一些静态操作。

4.修饰类:static 修饰的类称为静态内部类,静态内部类的实例化不需要外部类的实例对象。

5.导入静态成员:使用 static import 可以直接导入类中的静态成员,可以直接通过成员名访问,而无需使用类名前缀。

6.控制访问权限:使用 static 可以将成员(变量或方法)设置为私有的,限制外部访问。


6.什么是模板

       在C++中,模板是一种通用的编程工具,它允许程序员编写独立于特定数据类型的函数或类。模板可以在编译时根据传入的参数类型生成对应的代码,从而实现代码的复用和泛型编程。

        在函数模板中,可以定义一个通用的函数,它可以适用于不同类型的数据。例如,可以创建一个模板函数来实现两个整数相加的功能,该函数可以接受任意类型的整数作为参数,并返回它们的和。

        在类模板中,可以定义一个通用的类,它可以适用于不同类型的数据。例如,可以创建一个模板类来实现动态数组的功能,该类可以存储任意类型的数据,并提供动态扩展和访问元素的方法。

        使用模板可以提高代码的灵活性和可复用性,同时减少代码的重复编写。


7.include " " 和 <> 的区别

        " "(双引号)一般用来引用文件路径或包名。在许多编程语言中,使用双引号包围文件路径或包名可以表示一个字符串,这样可以在程序中使用这个字符串来操作文件或调用包中的功能。例如,在C语言中,#include "stdio.h" 表示将文件 stdio.h 包含(include)到程序中。

        <>(尖括号)常用于包含预编译指令或引用标准库文件。在某些编程语言中,尖括号用来引用标准库文件或头文件,这样可以避免与用户自定义的文件或包发生命名冲突。例如,在C语言中,#include &lt;stdio.h> 表示将标准库文件 stdio.h 包含到程序中。


8.函数指针和指针函数的区别

        函数指针是指向函数的指针变量。函数指针可以存储函数的地址,并且可以通过函数指针调用函数。函数指针的类型必须与所指向的函数的返回值类型和参数类型相匹配。

        指针函数是返回指针的函数。指针函数声明时,在函数名之前使用"*"来表示返回的是一个指针。指针函数可以返回指针变量的地址,从而可以访问该指针变量指向的数据。


9.C++ 11 nullptr 比 NULL 优势

       1.类型安全性:nullptr是一个特殊的空指针常量,它的类型是nullptr_t,与其他指针类型不兼容。这意味着你不能将nullptr隐式地转换为其他指针类型,从而提高了类型安全性。

       2.可读性:nullptr明确地表示空指针,更容易理解和阅读。相比之下,NULL在一些上下文中可能导致歧义,因为NULL是一个宏,其实际值可能是0或者(void*)0。

       3.重载支持:nullptr是一个能够进行函数重载的实体,而NULL则无法进行函数重载,它只是一个预处理宏。这使得函数参数能够与nullptr进行重载。

       4.消除二义性:在C++中,存在函数重载的情况下,传递NULL可能会产生二义性,因为NULL可以被解释为0或者(void*)0。而使用nullptr则可以避免这种二义性,因为它只能被解释为空指针。


10.深拷贝和浅拷贝的区别

       浅拷贝是指创建一个新的对象,该对象的内容是原对象中的引用。也就是说,新对象和原对象会共享同样的内存地址,当修改其中一个对象时,另一个对象也会受到影响。浅拷贝可以通过复制引用数据类型的指针或者引用来实现,例如通过复制引用类型的对象、数组或者集合。

       深拷贝是指创建一个新的对象,该对象的内容是原对象中的值而不是引用。也就是说,新对象和原对象是完全独立的,修改其中一个对象不会影响另一个对象。深拷贝需要递归复制引用类型的成员对象,确保每个成员对象都创建一个独立的副本。

       在实际编程中,我们需要根据需求来选择使用深拷贝还是浅拷贝。若需要保持对象之间的独立性,避免互相影响,则应使用深拷贝。否则,如果只需要对象的引用共享,或者对象中没有引用类型的成员对象,则可以使用浅拷贝来提高效率。


 结语:关于本次常见面试题的梳理到这里就结束了,希望本篇文章的分享会对大家的面试带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言,最后祝愿每位伙伴都能找到心意的工作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣404 左叶子之和 Java版本

文章目录 题目描述解题思路代码 题目描述 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 2…

二手手机管理系统|基于Springboot的二手手机管理系统设计与实现(源码+数据库+文档)

二手手机管理系统目录 目录 基于Springboot的二手手机管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户管理功能的实现界面 2、用户中心管理功能的实现界面 3、新闻信息管理功能的实现界面 4、商品收藏管理功能的实现界面 5、订单管理功能的实现界…

2024年3月6日 十二生肖 今日运势

小运播报&#xff1a;2024年3月6日&#xff0c;星期三&#xff0c;农历正月廿六 &#xff08;甲辰年丁卯月己巳日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;牛、猴、鸡 需要注意&#xff1a;鼠、虎、猪 喜神方位&#xff1a;东北方 财神方位&#xff1a;正…

【pyinstaller打包记录】Windows系统打包exe后,onnxruntime报警告(Init provider bridge failed)

简介 PyInstaller 是一个用于将 Python 程序打包成可执行文件&#xff08;可执行程序&#xff09;的工具。它能够将 Python 代码和其相关的依赖项&#xff08;包括 Python 解释器、依赖的模块、库文件等&#xff09;打包成一个独立的可执行文件&#xff0c;方便在不同环境中运行…

【Java设计模式】五、建造者模式

文章目录 1、建造者模式2、案例&#xff1a;共享单车的创建3、其他用途 1、建造者模式 某个对象的构建复杂将复杂的对象的创建 和 属性赋值所分离&#xff0c;使得同样的构建过程可以创建不同的表示建造的过程和细节调用者不需要知道&#xff0c;只需要通过构建者去进行操作 …

【SpringBoot3.x教程 01】SpringBoot简介及工程搭建

前言&#xff1a;什么是SpringBoot&#xff1f; SpringBoot是一个开源的Java基础框架&#xff0c;它被设计来简化Spring应用的初始搭建以及开发过程。这个框架利用了“约定优于配置”的理念&#xff0c;提供了一系列大型项目中常用的默认配置&#xff0c;让开发者可以快速启动和…

kafka查看消息两种方式(命令行和软件)+另附发送消息方式

1、命令行方式 ①找到kafka安装文件夹 ②执行命令 #指定offset为指定时间作为消息起始位置 kafka-consumer-groups.sh \ --bootstrap-server 20.2.246.116:9092 \ --group group_1 \ --topic lanxin_qiao \ --reset-offsets \ --to-datetime 2023-07-19T01:00:00.000 \ -exe…

解决Maven项目中的依赖冲突

1. 排查依赖冲突 在IDEA中下载插件 Maven Helper用于排查依赖版本冲突。 打开项目的pom.xml文件&#xff0c;点击下方的【Dependency Analyzer】按钮切换到依赖解析页面。 2. 解决版本依赖 在依赖解析页面进行依赖冲突排查操作&#xff1a; 点击 【Exclude】 后会在爆红处所对…

Java多线程实现发布和订阅

目录 简介 步骤 1: 定义消息类 步骤 2: 创建发布者 步骤 3: 创建订阅者 步骤 4: 实现发布-订阅模型 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡…

Claude 3正式发布,超越GPT-4,一口气读15万单词,OpenAI最强的大对手!

目录 多模态AI大模型Claude 3&#xff08;https://www.anthropic.com/news/claude-3-family&#xff09;Claude 3 的三个版本新增功能&#xff0c;chatgpt没有的使用成本总结 多模态AI大模型Claude 3&#xff08;https://www.anthropic.com/news/claude-3-family&#xff09; …

Stable Diffusion 3报告

报告链接&#xff1a;https://stability.ai/news/stable-diffusion-3-research-paper 文章目录 要点表现架构细节通过重新加权改善整流流量Scaling Rectified Flow Transformer Models灵活的文本编码器RF相关论文 要点 发布研究论文&#xff0c;深入探讨Stable Diffuison 3的…

Sora到底有多强?

北京时间2月16日凌晨&#xff0c;OpenAI发布文本生成视频的AI模型Sora&#xff0c;瞬时刷屏科技圈&#xff0c;成为2024年开年“顶流”。 官方称&#xff0c;Sora只需文本就能自动生成高度逼真和高质量的视频&#xff0c;且时长突破1分钟。这是继文本模型ChatGPT和图片模型Dal…

三整数排序问题的解题逻辑

【题目描述】 输入3个整数&#xff0c;从小到大排序后输出。 【样例输入】 20 7 33 【样例输出】 7 20 33 【解析】 本题解法大概有3种&#xff1a; 1、穷举条件法。 此方法先判断a、b、c大小的所有可能&#xff0c;再根据各种可能性输出不同的排序。 思路是先判断a、…

3Dmax最全快捷键大全,赶紧收藏起来练习起来吧

3Dmax做为一款专业的建模软件&#xff0c;有很多快捷键能帮助我们更好地学习&#xff0c;提升自己的能力。 废话不多说&#xff0c;我们一起来看看。 以上就是3dmax最全快捷键大全&#xff0c;看着容易&#xff0c;但是想要掌握好还需要我们多多练习。 本地max跑图太慢的朋友可…

数据链路层----滑动窗口协议的相关计算

目录 1.窗口大小的相关计算 •停等协议&#xff1a; •后退N帧协议&#xff1a; •选择重传协议&#xff1a; 2.信道利用率相关计算 •停等协议的信道利用率&#xff1a; •连续ARQ&#xff08;后退N帧协议&#xff0c;选择重传协议&#xff09;的信道利用率&#xff1a;…

SAP PP学习笔记04 - BOM2 -通过Serial来做简单的BOM变式配置,副明细,BOM状态,BOM明细状态,项目种类,递归BOM

本章继续讲BOM。 本章讲通过Serial来做简单的BOM变式配置。还讲了BOM的相关概念&#xff1a;副明细&#xff0c;BOM状态&#xff0c;BOM明细状态&#xff0c;项目种类&#xff0c;递归BOM 等。 1&#xff0c;通过Serial&#xff08;序列号&#xff09;来做简单的 VC&#xff0…

软考信息系统项目管理师零基础怎么学习?

软考考信息系统项目管理师&#xff0c;零基础怎么入手高项&#xff1f; 要我说对于没有基础的人群来说零基础考信息系统项目管理师还是有一定的难度的&#xff0c;难就难在需要时间去了解基础&#xff0c;而相对于系统分析师、系统构架设计师、网络规划设计师、系统规划与管理…

C++多态详解

文章目录 多态概念定义及实现构成条件虚函数虚函数的重写override 和 final重载、覆盖、隐藏 抽象类纯虚函数接口继承与实现继承 多态的原理虚函数表原理动态绑定与静态绑定 多继承的虚函数表多继承中的虚函数表 多态 概念 多态是面向对象三大特性中相对复杂的一个&#xff0…

c语言网络编程学习整理 网络编程结构框架 一些常见协议的介绍

1.网络分层&#xff1a;osi体系结构 重点&#xff1a;网络层&#xff0c;传输层。 口诀&#xff1a;物数网传会表应。 可是osi体系过于理想&#xff0c;不过其为原型依旧通用&#xff1a; TCP/IP协议 是Internet事实上的工业标准 2.TCP/IP 4层模型 1&#xff09;网络接口与…

Java生成 word报告

Java生成 word报告 一、方案比较二、Apache POI 生成三、FreeMarker 生成 在网上找了好多天将数据库信息导出到 word 中的解决方案&#xff0c;现在将这几天的总结分享一下。总的来说&#xff0c;Java 导出 word 大致有 5 种。 一、方案比较 1. Jacob Jacob 是 Java-COM Bri…