一、2023.9.27.C++基础.1

news2024/11/21 1:38:08

回答问题一定要有逻辑性,我将从
这个技术是什么?
为什么要有这个技术?
这个技术底层是怎么实现的?
这个技术的优点缺点?
这个技术所适合的使用场景?
以下五个方面来回答问题。

文章目录

  • 一、C++基础部分
    • (一)C++特点。
    • (二)说说C语言和C++的区别。
    • (三)说说 C++中 struct 和 class 的区别。
    • (四) include头文件的顺序以及双引号""和尖括号<>的区别。
    • (五)说说C++结构体和C结构体的区别。
    • (六)导入C函数的关键字是什么,C++编译时和C有什么不同?
    • (七)C++从代码到可执行二进制文件的过程?
    • (八)说说static关键字的作用
    • (九)数组和指针的区别
    • (十)说说什么是函数指针,如何定义函数指针,有什么使用场景?
    • (十一) 静态变量什么时候初始化?
    • (十二)nullptr对象调用成员函数可以吗?为什么?
    • (十三)说说什么是野指针,怎么产生的,如何避免
    • (十四)说说静态局部变量,全局变量,局部变量的特点,以及使用场景
    • (十五)说说内联函数和宏函数的区别
    • (十六)内联函数使用的条件:

一、C++基础部分

(一)C++特点。

  1. C++在C语言的基础上引入了面向对象的机制,同时也兼容C语言。
  2. C++有三大特性,封装,继承,多态。
  3. C++生成的代码质量高,效率高。
  4. C++语言编写出的程序结构清晰、易于扩充,程序可读性好。
  5. C++更加安全,增加了const常量、引用、四类cast转化(static_cast、dynamic_cast、
    const_cast、reinterpret_cast)、智能指针、try—catch等等;
  6. C++可复用性高,C++引入了模板的概念,标准模板库STL(Standard Template Library)。

(二)说说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语言的函数库更灵活、更通用。

(三)说说 C++中 struct 和 class 的区别。

  1. struct一般用于描述一个数据结构的集合,而class是对一个对象数据的封装。
  2. struct 中默认的访问控制权限是 public 的,而 class 中默认的访问控制权限是 private 的。
  3. 在继承关系中,struct 默认是公有继承,而 class 是私有继承。
  4. class 关键字可以用于定义模板参数,就像 typename,而 struct 不能用于定义模板参数。

(四) include头文件的顺序以及双引号""和尖括号<>的区别。

定义:尖括号<>的头文件是系统文件,双引号""的头文件是自定义文件。

区别:编译器预处理阶段查找头文件的路径不一样

  1. 使用尖括号<>的头文件的查找路径:编译器设置的头文件路径–>系统变量。
  2. 使用双引号""的头文件的查找路径:当前头文件目录–>编译器设置的头文件路径–>系统变
    量。

(五)说说C++结构体和C结构体的区别。

区别:

  1. C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。
  2. C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。
  3. C语言的结构体是不可以继承的,C++的结构体可继承。
  4. C 中使用结构体需要加上 struct 关键字,而 C++ 中可以省略 struct 关键字直接使用。
  5. C++ 中的 struct 是对 C 中的 struct 进行了扩充,它们在声明时的区别如下:
    在这里插入图片描述

(六)导入C函数的关键字是什么,C++编译时和C有什么不同?

  1. 关键字:在C++中,导入C函数的关键字是extern,表达形式为extern “C”, extern "C"的主要作
    用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代
    码按C语言的进行编译,而不是C++的。
  2. 编译区别由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译
    后的代码中,而不仅仅是函数名
    ;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带
    上函数的参数类型,一般只包括函数名。

(七)C++从代码到可执行二进制文件的过程?

C++和C语言类似,一个C++程序从源码到执行文件,有四个过程,预编译、编译、汇编、链接。

  1. 预编译:这个过程主要的处理操作如下:
    将所有的#define删除,并且展开所有的宏定义
    处理所有的条件预编译指令,如#if、#ifdef
    处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
    过滤所有的注释
    添加行号和文件名标识
  2. 编译:这个过程主要的处理操作如下:
    词法分析:将源代码的字符序列分割成一系列的记号。
    语法分析:对记号进行语法分析,产生语法树。
    语义分析:判断表达式是否有意义。

    代码优化。
    目标代码生成:生成汇编代码
    目标代码优化。
  3. 汇编:这个过程主要是将汇编代码转变成机器可以执行的指令。
  4. 链接:将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。
    链接分为静态链接和动态链接:
    静态链接,是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中,就算你在去
    把静态库删除也不会影响可执行程序的执行
    ;生成的静态链接库,Windows下以.lib为后缀,Linux下
    以.a为后缀。

    动**态链接,是在链接的时候没有把调用的函数代码链接进去,**而是在执行的过程中,再去找要链接的函
    数,生成的可执行文件中没有函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程
    序就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。

(八)说说static关键字的作用

  1. 定义全局静态变量和局部静态变量:初始化的静态变量会在数据段分配内存,未初始化的静态变量
    会在BSS段分配内存。直到程序结束,静态变量始终会维持前值。
  2. 定义静态函数:静态函数只能在本源文件中使用;如 static void func();
  3. 定义静态变量。静态变量只能在本源文件中使用;
  4. 定义类中的静态成员变量:使用静态数据成员,它既可以被当成全局变量那样去存储,但又被隐藏
    在类的内部。类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对
    象。所有这些对象的静态数据成员都共享这一块静态存储空间。
  5. 定义类中的静态成员函数:如静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象
    的静态数据成员都共享这一块静态存储空间。

此外:
当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成
员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针
。既然它没有指向某一对象,也
就无法对一个对象中的非静态成员进行访问!
在这里插入图片描述

(九)数组和指针的区别

  1. 概念
    (1)数组:数组是用于储存多个相同类型数据的集合。 数组名是首元素的地址。
    (2)指针:指针相当于一个变量,它存放的是其它变量在内存中的地址。 指针名指向了内存的首地址。
  2. 区别:
    (1)赋值:同类型指针变量可以相互赋值;数组不行,只能一个一个元素的赋值或拷贝
    (2)存储方式:
    数组:数组在内存中是连续存放的,数组的存储空间,不是在静态区就是在栈上。
    指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。由
    于指针本身就是一个变量,再加上它所存放的也是变量,所以指针的存储空间不能确定。
    (3)求sizeof:
    数组所占存储空间的内存大小**:sizeof(数组名)/sizeof(数据类型)**
    在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类
    型是什么,sizeof(指针名)都是8。

(十)说说什么是函数指针,如何定义函数指针,有什么使用场景?

  1. 概念:函数指针就是指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指
    针所指向的地址。
  2. 定义形式如下:
int func(int a);
int (*f)(int a);
f = &func;
  1. 函数指针的应用场景:回调(callback)。我们调用别人提供的 API函数(Application
    Programming Interface,应用程序编程接口),称为Call;如果别人的库里面调用我们的函数,就叫
    Callback。
  2. 例子:比如你要让windows系统知道在某种事件(如:鼠标按下)发生后该如何响应(或根本不响应),但系统怎么知道你的程序里有这么一个函数是用来响应鼠标按下的呢?所以在这个函数前面加一个CALLBACK并把此函数地址赋给系统,windows就知道调用哪个函数来响应哪个事件。具体可以看看关于回调函数的解释。

(十一) 静态变量什么时候初始化?

  • 对于C语言的全局和静态变量,初始化发生在任何代码执行之前,属于编译期初始化。
  • 而C++标准规定:全局或静态对象当且仅当对象首次用到时才进行构造。

(十二)nullptr对象调用成员函数可以吗?为什么?

能。

  • 原因:因为在编译时对象就绑定了函数地址,和指针空不空没关系。

(十三)说说什么是野指针,怎么产生的,如何避免

  1. 概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
  2. 产生原因:释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的
    错误。这些我们都要注意避免。
  3. 避免办法:
    (1)初始化置NULL
    (2)申请内存后判空
    (3)指针释放后置NULL
    (4)使用智能指针

(十四)说说静态局部变量,全局变量,局部变量的特点,以及使用场景

  1. 首先从作用域考虑:C++里作用域可分为6种:全局,局部,类,语句,命名空间和文件作用域。
    全局变量:全局作用域,可以通过extern作用于其他非定义的源文件。
    静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。
    局部变量:局部作用域,比如函数的参数,函数内的局部变量等等。
    静态局部变量 :局部作用域,只被初始化一次,直到程序结束。
  2. 从所在空间考虑:除了局部变量在栈上外,其他都在静态存储区。因为静态变量都在静态存储区,
    所以下次调用函数的时候还是能取到原来的值。
  3. 生命周期: 局部变量在栈上,出了作用域就回收内存;而全局变量、静态全局变量、静态局部变量
    都在静态存储区,直到程序结束才会回收内存。

(十五)说说内联函数和宏函数的区别

区别:

  1. **宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,**省去了函
    数压栈退栈过程,提高了效率;而内联函数本质上是一个函数,内联函数一般用于函数体的代码比
    较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自
    身。
  2. 宏函数是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换 ;而内联函数则是
    在编译的时候进行代码插入
    ,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这
    样可以省去函数的调用的开销,提高效率!
  3. 宏定义是没有类型检查的,无论对还是错都是直接替换;而内联函数在编译的时候会进行类型的检
    查,内联函数满足函数的性质,比如有返回值、参数列表等。

(十六)内联函数使用的条件:

**内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。**如果
执行函数体内代码的时间,相比于函数调用的开销较大,那么效率 的收获会很少。另一方面,每一
处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜
使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
内联不是什么时候都能展开的,一个好的编译器将会根据函数的定义体,自动地取消不符合要求的
内联。

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

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

相关文章

自动化测试-友好的第三方库

目录 mock furl coverage deepdiff pandas jsonpath 自动化测试脚本开发中&#xff0c;总是会遇到各种数据处理&#xff0c;例如MOCK、URL处理、JSON数据处理、结果断言等&#xff0c;也会遇到所采用的测试框架不能满足当前需求&#xff0c;这些问题都需要我们自己动手解…

Element UI搭建首页导航和左侧菜单以及Mock.js和(组件通信)总线的运用

目录 前言 一、Mock.js简介及使用 1.Mock.js简介 1.1.什么是Mock.js 1.2.Mock.js的两大特性 1.3.Mock.js使用的优势 1.4.Mock.js的基本用法 1.5.Mock.js与前端框架的集成 2.Mock.js的使用 2.1安装Mock.js 2.2.引入mockjs 2.3.mockjs使用 2.3.1.定义测试数据文件 2…

多元异构、绿色节能,揭秘浪潮计算机基础技术研究与整机柜设计思路

出品 | CSDN 云计算 数字化转型、云计算 技术与应用的爆发&#xff0c;数据中心从传统 CPU 为核心&#xff0c;变为 CPU、GPU、ASIC、FPGA、DPU 等等多种硬件与芯片架构、多元算力并存的阶段。对于企业来说&#xff0c;数字化转型中算力就是生产力&#xff0c;底层算力底座可能…

可信执行环境(Tee)入门综述

SoK: Hardware-supported Trusted Execution Environments [ArXiv22] 摘要引言贡献 范围系统和威胁模型系统模型威胁模型共存飞地对手无特权软件对手系统软件对手启动对手外围对手结构对手侵入性对手 关于侧信道攻击的一点注记 VERIFIABLE LAUNCH信任根&#xff08;RTM&#xf…

jvm深入研究文档--jvm分区以及职责

Java虚拟机&#xff08;JVM&#xff09;主要包括以下几个区域&#xff1a; 方法区&#xff08;Method Area&#xff09;&#xff1a;这个区域存储已被加载的类信息&#xff0c;常量&#xff0c;静态变量&#xff0c;即时编译器编译后的代码等数据。方法区是所有线程共享的。在…

C. Card Game

题目&#xff1a;样例&#xff1a; 输入 4 4 -4 1 -3 5 4 1 -2 3 -4 3 -1 3 -5 1 -1输出 5 4 2 0 思路&#xff1a; 这里的题意就是&#xff0c; 当我们 i 取奇数的时候&#xff0c;可以获得该奇数 i 的值&#xff0c;并去掉当前卡牌。 当我们 i 取偶数的时候&#xff0c;去掉当…

钢轨长度及允许偏差

声明 本文是学习GB-T 2585-2021 铁路用热轧钢轨. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了铁路用钢轨的订货内容、分类、尺寸、外形、质量及允许偏差、技术要求、试验方法、检 验规则、标志及质量证明书。 本标准适用于3…

【斯坦福cs324w】中译版 大模型学习笔记九 大模型之Adaptation

文章目录 引言Adaptation的必要性从llm的训练过程分析从下游任务和原始训练任务之间的差异分析 通用的Adaptation配置 当前主流的Adaptation方法ProbingFine-tuningLightweight Fine-tuningPrompt TuningPrefix TuningAdapter Tuning 参考资料 在特定领域的下游任务中&#xff…

【Git】轻松学会 Git(一):掌握 Git 的基本操作

文章目录 前言一、创建 Git 本地仓库1.1 什么是仓库1.2 创建本地仓库1.3 .git 目录结构 二、配置 Git三、认识 Git 的工作区、暂存区和版本库3.1 什么是 Git 的工作区、暂存区和版本库3.2 工作区、暂存区和版本库之间的关系 四、添加文件4.1 添加文件到暂存区和版本库中的命令4…

面试官:Redis基本命令有哪些,Redis怎么实现分布式锁?

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 一、Redis基本数据类型与使用场景1、S…

IP地址定位的特点

IP地址定位是一种广泛应用于网络领域的技术&#xff0c;它允许我们确定特定设备或用户在互联网上的位置。这项技术在很多方面都具有重要的特点&#xff0c;本文将深入探讨这些特点。 1.全球性覆盖&#xff1a; IP地址定位IP66_ip归属地在线查询_免费ip查询_ip精准定位平台具有全…

macOS Sonoma 14 正式版(23A344)发布,附黑/白苹果镜像下载地址

系统介绍&#xff08;系统下载地址&#xff1a;http://www.imacosx.cn/115300.html&#xff09; 黑果魏叔9 月 27日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS Sonoma 14 正式版&#xff08;23A344&#xff09;。 macOS 14正式版系统发布&#xff1a;全新功能与改…

Linux:理解进程的多种状态

文章目录 理解状态运行状态阻塞状态挂起状态Linux系统下的进程状态的解析状态的查看 本篇总结的是进程的多种状态 对于进程的状态理解&#xff0c;在教材上通常是有下面的思维模式图 那么如何理解上面图片中的内容&#xff1f; 理解状态 如何理解状态&#xff1f;其实理解状…

什么是HTTP头部(HTTP headers)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 理解 HTTP 头部&#xff08;HTTP Headers&#xff09;⭐ HTTP 头部的分类⭐ HTTP 头部的应用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#x…

基于Python Django的公务员考试信息管理系统

文章目录 1 简介2. 技术栈3 功能分析4 功能具体设计4.1 软件功能模块设计4.2数据库设计与实现4.2.1概念模型设计4.2.2数据库逻辑结构设计 5系统详细设计5.1系统功能模块5.2管理员功能模块 六 源码咨询 1 简介 公务员考试信息管理系统的开发运用Python技术&#xff0c;MIS的总体…

8月数据出炉!NOA与激光雷达「分道扬镳」?降本大战升级

对于激光雷达赛道来说&#xff0c;如何在市场整体需求更加偏向强调性价比的背景下&#xff0c;继续维持前装出货的增速&#xff0c;已经成为新的考验。 进入2023年&#xff0c;高阶智驾&#xff08;中国市场以NOA为代表&#xff09;&#xff0c;继续保持向上势头。8月&#xff…

Archlinux Timeshift的系统备份与还原

服务器在滚挂或误删系统文件,timeshift系统备份与还原的情景: 安装 timeshif 1 yay -s timeshif 备份设置 选择快照类型 此处选择【RSYNC】 选择储存位置 每台设备安装分区不一样,大家安装实际情况选择,一般选择比较大的空间存储,并且最好是机械,这样不容易损坏 设置计…

实战项目:VB实现小鸟快跑小游戏

文章目录&#xff1a; 一&#xff1a;效果演示 二&#xff1a;实现思路 三&#xff1a;代码实现 form1 效果图 代码 form2 效果图 代码 一&#xff1a;效果演示 效果图◕‿◕✌✌✌ 代码下载 二&#xff1a;实现思路 窗口1 就是实现窗口的跳转和关闭窗口2 1.先添加背…

【接口测试】Chrome浏览器F12调试工具抓包详细分析(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 调试时使用最多的…

Docker网络+资源控制

一、Docker网络 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。…