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)学习是机器学习和人工智能领域的一个重要分支,它涉及从多个不同类型的输入数据中提取信息,并将这些信息融合以改善模型的性能。多模态学习能够处理的数据类型广泛,包括但不限…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...