C++面试突破---C/C++基础
1.C++特点
1. C++在C语言基础上引入了面对对象的机制,同时也兼容C语言。
2. C++有三大特性(1)封装。(2)继承。(3)多态;
3. C++语言编写出的程序结构清晰、易于扩充,程序可读性好。
4. C++生成的代码质量高,效率高,
5. C++更加安全,增加了const常量、引用、四类cast转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)、智能指针、try—catch等等;
6. C++可复用性高,C++引入了模板的概念,标准模板库STL。
2.C语言和C++的区别
1. C语言是C++的子集,C++可以很好兼容C语言。但是C++又有很多新特性,如引用、智能指针、auto变量等。
2. C++是 面对对象 的编程语言;
C语言是 面对过程 的编程语言。
3. C语言有一些不安全的语言特性,如指针使用的潜在危险、强制转换的不确定性、内存泄露等。而C++对此增加了不少新特性来改善安全性,如const常量、引用、cast转换、智能指针、try—catch等等;
4. C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便开发的标准模板库STL。C++的STL库相对于C语言的函数库更灵活、更通用。
3.C++中 struct 和 class 的区别
1. struct 一般用于描述一个数据结构集合,而 class 是对一个对象数据的封装;
2. struct 中默认的访问控制权限是 public 的,
class 中默认的访问控制权限是 private 的。
3. 在继承关系中,struct 默认是公有继承,而 class 是私有继承;4. class 关键字可以用于定义模板参数,就像 typename,而 struct 不能用于定义模板参数
4.include头文件的顺序以及双引号""和尖括号<>的区别
区别:
- 尖括号<>的头文件是系统文件,双引号""的头文件是自定义文件。
- 编译器预处理阶段查找头文件的路径不一样。
查找路径:
- 使用尖括号
<>时,编译器会按照以下顺序查找头文件:
编译器设置的头文件路径 --> 系统变量- 使用双引号
""时,查找路径的顺序如下:
当前头文件目录 --> 编译器设置的头文件路径 --> 系统变量
5.C++结构体和C结构体的区别
| 特性 | C | C++ |
|---|---|---|
| 成员函数 | 不可以 | 可以 |
| 静态成员 | 不可以 | 可以 |
| 访问权限 | 默认 public,不能修改 | public/private/protected |
| 继承关系 | 不可以继承 | 可从类或其他结构体继承 |
| 初始化 | 不能直接初始化数据成员 | 可以直接初始化数据成员,也可使用构造函数 |
6.导入C函数的关键字,C++编译时和C有何不同
关键字:在C++中,导入C函数的关键字是extern “C”,主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言进行编译。
编译区别:由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。
7.C++从代码到可执行二进制文件的过程
- 预处理:
头文件展开,去注释,条件编译,宏替换,形成 .i文件(还是C语言)
目的:通过处理这些预编译指令,生成一个没有宏定义、条件编译指令和注释的中间文件,为后续的编译阶段做准备。- 编译:
将C语言翻译为汇编语言,形成 .s 文件(此时是汇编代码)
目的:将预编译后的源代码转换为汇编代码,这个过程涉及到对源代码的语法、语义分析和优化,最终生成机器相关的汇编代码。- 汇编:
将汇编代码变成可重定位二进制文件,形成.o文件- 链接:
.o文件 +系统库 形成可执行程序
目的:将多个目标文件和库文件链接在一起,生成一个完整的可执行文件或库文件。链接分为静态链接和动态链接。
静态链接:在链接阶段,将程序所需要的库函数的代码直接复制到可执行文件中。当编译器生成目标文件后,链接器会把程序所依赖的静态库中的代码提取出来,与目标文件合并成一个完整的可执行文件。优点:可执行文件独立运行,不依赖其他文件,部署方便。
缺点:可执行文件较大,因为包含了所有用到的库代码;如果库有更新,需要重新编译整个程序。
生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。
动态链接:在程序运行时才去加载所需要的库函数。在链接阶段,链接器不会把库函数的代码复制到可执行文件中,而是在可执行文件中记录对库函数的引用信息。当程序运行时,操作系统的动态链接器会根据这些引用信息去查找并加载相应的动态库。优点:可执行文件较小,多个程序可以共享同一个动态链接库,节省内存;库更新时,只需更新库文件,无需重新编译所有程序。
缺点:运行时需要依赖动态链接库,如果库文件不存在或版本不匹配,可能导致程序无法运行。
生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。
8.static关键字的作用
修饰局部变量
- 当
static修饰局部变量时,该变量的存储方式发生改变。通常局部变量存储在栈区,函数调用结束后,栈上的局部变量就会被销毁。但是被static修饰的局部变量存储在静态存储区,它的生命周期贯穿整个程序的运行期。修饰全局变量和函数
- 当
static修饰全局变量时,这个全局变量的作用域被限制在定义它的源文件内,其他源文件不能访问这个变量。这有助于实现信息隐藏,避免不同源文件之间的命名冲突。修饰类的成员变量和成员函数
- 修饰成员变量:
- 当
static修饰类的成员变量时,该成员变量被所有类的对象所共享。它不属于某个特定的对象,而是属于类本身。- 修饰成员函数:
- 被
static修饰的类成员函数可以通过类名直接调用,而不需要创建类的对象。并且在静态成员函数中,只能访问类的静态成员变量和其他静态成员函数,不能访问非静态成员变量和非静态成员函数。
原因:当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问。
9.静态变量何时初始化
C语言的全局和静态变量,初始化发生在任何代码执行之前,属于编译期初始化。
C++标准规定:全局或静态对象当且仅当对象首次用到时才进行构造。
“按需初始化”好处:
- 提高效率:只有在实际需要使用对象时才进行构造,避免了不必要的初始化操作,特别是对于那些在程序中可能不会被使用的对象。
- 减少依赖:延迟初始化可以减少对象之间的依赖关系,降低了对象之间的紧密耦合,只需要在使用时获取其值。
- 支持动态初始化:对于一些需要在运行时确定初始化值的情况,延迟初始化提供了更好的支持。
10.静态全局/局部变量,全局/局部变量特点,及使用场景
作用域:
- 全局变量具有全局作用域,可以在程序的任何地方访问。通过
extern关键字,可以在其他非定义的源文件中使用。当需要在多个函数之间共享数据,或者需要在程序的不同部分访问同一个变量时,可以使用全局变量。- 静态全局变量具有全局作用域,但加上文件作用域的限制,使其只能在定义它的文件中使用。当需要在一个文件内共享数据,但不希望其他文件访问该变量时,可以使用静态全局变量。
- 局部变量具有局部作用域,通常是在函数内部或代码块内定义,只能在该范围内访问。局部变量在函数执行完毕后会被销毁。当需要在函数内部临时存储数据,并且该数据只在函数内部使用时,可以使用局部变量。
- 静态局部变量具有局部作用域,但它在函数调用之间保持其值,只初始化一次。当需要在函数内部保存一个值,并且该值在函数的多次调用之间需要保持不变时,可以使用静态局部变量。
所在空间:
- 局部变量通常存储在栈上,随着函数的调用和返回而分配和释放内存。
- 其他变量(全局变量、静态全局变量、静态局部变量)存储在静态存储区,它们在程序的整个运行期间都存在。
11.数组和指针
数组:数组是用于储存多个相同类型数据的集合。 数组名是首元素的地址。
指针:指针相当于一个变量,它存放的是其它变量在内存中的地址。 指针名指向了内存的首地址。
区别:
- 赋值:同类型指针变量可以相互赋值;数组只能一个一个元素的赋值或拷贝
- 存储方式:
- 数组:数组在内存中是连续存放的,在静态区(全局数组)或栈上(局部数组)。
- 指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。
- sizeof求法:
数组所占存储空间的内存大小:sizeof(数组名)/sizeof(数据类型)
在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4
在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。
11.函数指针及使用场景
函数指针就是指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。
定义:
返回类型 (*指针变量名)(参数列表) = 函数名;使用场景:
回调函数:函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
12.nullptr可以调用成员函数吗?
从对象和成员函数的关系来理解:
成员函数实际上是通过一个隐式的this指针来访问对象的成员。当通过对象(或者对象指针)调用成员函数时,编译器会将对象的地址作为this指针传递给成员函数。当指针是
nullptr时,就没有一个有效的对象来提供这个this指针所需要的有效地址。通过nullptr调用成员函数会导致程序出现未定义行为。特殊情况:成员函数是
static的,它不依赖于对象实例(没有this指针),那么可以通过类名或者nullptr(从语法上)来调用。
13.野指针
概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
产生原因:释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的错误。这些我们都要注意避免。避免办法:
(1)初始化置NULL
(2)申请内存后判空
(3)指针释放后置NULL
(4)使用智能指针
14.C++的传值方式
值传递:
- 值传递是指在函数调用时,将实际参数的值拷贝一份传递给函数的形式参数。在函数内部,对形式参数的修改不会影响到实际参数的值。
引用传递:
- 引用传递是指在函数调用时,将实际参数的引用传递给函数的形式参数。在函数内部,对形式参数的修改会直接影响到实际参数的值。
指针传递:
- 指针传递是指在函数调用时,将实际参数的地址传递给函数的形式参数。在函数内部,可以通过解引用指针来访问和修改实际参数的值。
值传递用于对象时,整个对象会拷贝一个副本,这样效率低;而引用传递用于对象时,不发生拷贝行为,只是绑定对象,更高效;指针传递同理,但不如引用传递安全。
15.new/delete和malloc/free
- new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。
- new自动计算要分配的空间大小,malloc则需程序员指定。
- malloc和free返回的是void*指针(必须进行类型转换),new和delete返回的是具体类型指针。
- new内存分配失败时,会抛出bad_alloc异常。malloc分配内存失败时返回NULL。
- new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。
- malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数和析构函数功能,用malloc分配空间存储类的对象存在风险;new和delete除了分配回收功能外,还会调用构造函数和析构函数。
16.const和define
- define生效于预处理阶段;
const生效于编译的阶段。- define 只是简单的文本替换,不会对类型安全进行检査;
const 会进行类型检查。- define定义的常量,运行时是直接的操作数,并不会存放在内存中;
const定义的常量,在C语言中是存储在内存中、需要额外的内存空间的。
17.const int *a, int const *a, const int a, int *const a, const int *const a分别是什么
const int a; //指的是a是一个常量,不允许修改。
const int *a; //指向常量的指针,意味着通过这个指针不能修改其所指向内存中的值,但指针本身可以重新指向其他同类型(const int 类型)的内存地址。
int const *a; //同const int *a;
int *const a; //通过a指针可以修改它所指向内存中的值,但a指针不能指向其他的内存地址
const int *const a; //都不变,即(*a)不变,a也不变
18.指针与引用
指针:指针是一个变量,其值为另一个变量的地址。
引用:引用是一个别名,它在定义时必须被初始化,并且之后不能再绑定到其他对象。
指针可以有多级,引用只有一级
当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参,两者指向的地址相同,但不是同一个变量,在函数中改变这个变量的指向不影响实参,而引用却可以。
相关文章:
C++面试突破---C/C++基础
1.C特点 1. C在C语言基础上引入了面对对象的机制,同时也兼容C语言。 2. C有三大特性(1)封装。(2)继承。(3)多态; 3. C语言编写出的程序结构清晰、易于扩充,程序可读性好。…...
项目搭建+修改
一 : 在列表成功回调函数,追加数据中,添加修改的按钮 for (let x of res) {//追加数据$("#table").append(<tr><td><input type"checkbox" class"ck" value"\${x.uid}"></td><td>\${x.uid}</td>…...
每日算法一练:剑指offer——树篇(4)
1.计算二叉树的深度 某公司架构以二叉树形式记录,请返回该公司的层级数。 示例 1: 输入:root [1, 2, 2, 3, null, null, 5, 4, null, null, 4] 输出: 4 解释: 上面示例中的二叉树的最大深度是 4,沿着路径 1 -> 2 -> 3 -&…...
Nginx静态资源配置
基本配置原则 明确资源目录:为不同类型的静态资源指定不同的路径,这样可以避免路径冲突,并且便于管理。正确设置文件权限:确保 Nginx 具有读取静态资源的权限。缓存优化:为静态资源设置缓存头(如 expires&…...
困扰解决:mfc140u.dll丢失的解决方法,多种有效解决方法全解析
当电脑提示“mfc140u.dll丢失”时,这可能会导致某些程序无法正常运行,给用户带来不便。不过,有多种方法可以尝试解决这个问题。这篇文章将以“mfc140u.dll丢失的解决方法”为主题,教大家有效解决mfc140u.dll丢失。 判断是否是“mf…...
D3.js 初探
文章目录 D3.js 简单介绍选择集与方法数据绑定方法选择集添加DOM元素以及删除元素理解update enter 以及 exit关于比例尺layout 布局force layout 坐标轴元素添加动态效果demo1: 绘制简单柱状图 #D3.js 初探 最近在做一个Data Visualization 的项目,由于对最终呈现的…...
linux常用指令 | 适合初学者
linux常用指令 1.ls: 列出当前,目录中的文件和子目录 ls 2.pwd: 显示当前工作目录的路径 pwd3.cd切换工作目录 cd /path/to/director4.mkdir:创建新目录 mkdir directory_name5.rmdir:删除空目录 rmdir directory_name6.rm: 删除文件或目录 rm file_name r…...
用 NotePad++ 运行 Java 程序
安装包 网盘链接 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装完成: 配置编码 用 NotePad 写 Java 程序时, 需要设置编码. 在 设置, 首选项, 新建 中进行设置, 可以对每一个新建的文件起作用. 之前写的文件不起作用. 在文件名处右键, 可以快速打开 CMD 窗口, 且路…...
在 Linux 环境下搭建 OpenLab Web 网站并实现 HTTPS 和访问控制
实验要求 综合练习:请给openlab搭建web网站 网站需求: 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,…...
微信小程序wx.showShareMenu配置全局分享功能
在app.js文件中配置如下即可: onLaunch() {//开启分享功能this.overShare()},/*** 开启朋友圈分享功能* 监听路由切换/自动执行*/overShare() {wx.onAppRoute((res) > {// console.log(route, res)let pages getCurrentPages()let view pages[pages.length - …...
机器学习面试八股总结
下面是本人在面试中整理的资料和文字,主要针对机器学习面试八股做浅显的总结,大部分来源于ChatGPT,中间有借鉴一些博主的优质文章,已经在各文中指出原文。有任何问题,欢迎随时不吝指正。 文章系列图像使用动漫 《星游…...
南京邮电大学《2024年812自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《南京邮电大学812自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...
大数据新视界 -- Hive 数据湖集成与数据治理(下)(26 / 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
Android EventBus最全面试题及参考答案
目录 什么是 EventBus? 请解释 EventBus 是什么,以及它的工作原理。 简述 EventBus 的工作原理。 EventBus 的主要组成部分有哪些? EventBus 是如何实现发布订阅模式的? EventBus 与观察者模式有什么区别? Even…...
C++ 游戏开发:开启游戏世界的编程之旅(1)
在游戏开发领域,C 一直占据着极为重要的地位。它以高效的性能、对底层硬件的良好控制能力以及丰富的库支持,成为众多大型游戏开发项目的首选编程语言。今天,就让我们一同开启 C 游戏开发的探索之旅。 一、C 游戏开发基础 (一&am…...
SpringBoot mq快速上手
1.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.示例代码 基础信息配置 package com.example.demo.config;import org.springframework.amqp.co…...
图像处理网络中的模型水印
论文信息:Jie Zhang、Han Fang、Weiming Zhang、Wenbo Zhou、Hao Cui、Hao Cui、Nenghai Yu:Model Watermarking for Image Processing Networks 本文首次提出了图像处理网络中深度水印问题,将知识产权问题引入图像处理模型 提出了第一个深…...
Halcon 瑕疵检测原理及应用
摘要: 本文详细阐述了 Halcon 在瑕疵检测领域的原理、相关技术以及广泛的应用场景。首先介绍了 Halcon 软件的基本概况及其在机器视觉领域的重要地位,接着深入剖析了瑕疵检测所涉及的图像采集、预处理、特征提取与分析以及分类与判定等核心原理ÿ…...
JAVA 架构师面试 100套含答案:JVM+spring+ 分布式 + 并发编程》...
今年的行情,让招聘面试变得雪上加霜。已经有不少大厂,如腾讯、字节跳动的招聘名额明显减少,面试门槛却一再拔高,如果不用心准备,很可能就被面试官怼得哑口无言,甚至失去了难得的机会。 现如今,…...
多模态学习详解
多模态学习详解 引言 多模态(Multimodal)学习是机器学习和人工智能领域的一个重要分支,它涉及从多个不同类型的输入数据中提取信息,并将这些信息融合以改善模型的性能。多模态学习能够处理的数据类型广泛,包括但不限…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
