c++基础入门二

C++基础入门(二)

一、函数重载

在自然语言中,一句话或者一个词有不同的意思。例如:国乒和别人比赛是“谁也赢不了”,而国足和别人比赛是“谁也赢不了”

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

类型

一、参数类型不同

//函数名相同,参数不同
void ADD(int a, int b) {cout << a + b << endl;
}void ADD(double a, double b) {cout << a + b << endl;
}int main() {ADD(1, 3);ADD(2.3, 4.5);return 0;
}

image-20240913165853887

二、参数个数不同

//参数个数不同
void Fun() {cout << "Fun()" << endl;
}
void Fun(int a) {cout << "Fun(int a)" << endl;
}

三、参数的类型顺序不同

//参数顺序不同
void Add(int a, char b) {cout <<a<<b<< endl;
}
void Add(char b, int a) {cout << a<<b<< endl;
}int main() {Add(1, 'a');Add('a', 1);return 0;
}

实现原理

为什么C++支持函数重载,C不支持呢?

C/C++运行一个程序,需要经历几个阶段:预处理编译汇编链接

image-20240913174643866

程序执行的过程

image-20240913175304401

程序处理过程

在处理程序的过程中,为了识别重载的函数,编译时会给函数修饰规则,在不同系统环境下,对应的修饰规则也不同,因为Windous下的修饰规则太过于复杂,这里就演示Linux下的规则。

Linux下修饰规则*

gcc命令把test.c编译成C语言文件

//test.c
int Add(int a,int b){return a+b;
}
Fun(double a,int x,int *p){
}
int main(){Add(1,3);Fun(3,4,0)
}

image-20240913182004228

image-20240913181931811

在反汇编状态下,C语言是不支持函数重载的,也没有对应的命名规则。

g++命令把test.c`编译成**C++**文件

image-20240913193819167

可以看见,在Linux下函数修饰规则是

_Z+字符数+函数名+类型缩写

所以,C++就支持了函数重载。另外如果对Windous下的修饰规则感兴趣,可以查看微软官方的介绍修饰名 | Microsoft Learn

二、引用

引用不是定义一个新变量,而是给已经存在的变量别名,系统不会为引用开辟新的内存空间,而是和引用的变量公用一个内存空间。

如何理解引用呢。大家都知道,李逵在江湖上人称黑旋风,而在家被称为铁牛

用法:类型& 引用变量名(对象名)=对象

void Fun() {int a = 10;int& b = a;cout << a << endl;cout << b << endl;
}

image-20240913195150125

输出结果都是一样的

注意:引用的类型必须是实体的类型

特性

1、引用在定义时就必须初始化

2、一个变量可以有多个引用

3、该引用已经和实体绑定,就不能引用别的实体

int main() {int a = 10;//int& b;引用必须初始化int &b=a;int &bb=a;int &bbb=a;//可以有多个引用
}

image-20240913195935628

引用必须初始化

常引用

在引用常量const时,引用的变量也必须是const

就如一句话:权力只能向下兼容,不能以下犯上

int main() {const int a = 10;int& b = a;//会报错,因为a是常量类型const int& rb = a;//正确用法//向下兼容int b=100;const int& rb=b;
}

image-20240913201057784

使用场景

一、做参数

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}

在以往我们用C语言写一个交换函数是这样的,还需要指针。很不方便,而有了引用之后,比指针方便多了。

void Swap(int* a, int* b) {int tmp = *a;*b = *a;*a = tmp;
}

二、做返回值

int& Count()
{static int n = 0;n++;// ...return n;
}

引用和指针的区别

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址

  2. 引用在定义时必须初始化,指针没有要求

  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体

  4. 没有NULL引用,但有NULL指针

  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)

  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

  7. 有多级指针,但是没有多级引用

  8. 访问实体方式不同,指针需要显式解引用引用编译器自己处理

  9. 引用比指针使用起来相对更安全

三、内联函数

概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率

int ADD(int a, int b) {return a + b;
}
int main() {ADD(1, 4);return 0;
}

转到反汇编

image-20240914102446365

call命令可以理解成建立栈帧

可以看见ADD函数是新建立一个栈帧(消耗内存空间)。

在ADD前面加上inline,再进入反汇编查看

inline int ADD(int a, int b) {return a + b;
}int main() {ADD(1, 4);return 0;
}

image-20240914102841763

发现怎么还有call命令

1、在debug模式下,进入反汇编模式,是查看不了内联函数的

2、在release模式下,进入反汇编才能查看内联函数的过程

这里给出VS2022查看内联函数的设置

在资源管理器右键当前cpp文件,查看属性

image-20240914103236760

选择优化,然后找到内联函数展开,模式调成以下

image-20240914103411424

在常规里面,找到调试信息格式,改成程序数据库

image-20240914103450084

最后,我们在重新进入反汇编

image-20240914103559671

发现call已经神奇的消失了。说明内联函数在底层还是需要开辟空间,而在语法上是不开辟空间,直接在当前函数展开的。

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。

  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性

image-20240914104605777

可以看见内联函数对编译器来说,只是一个申请,而且行数也不能超过太多,一般10行以内就好。

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

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

相关文章

浪潮信息金风慧能:打造智慧新能源运营平台

近来&#xff0c;浪潮信息携手北京金风慧能技术有限公司&#xff08;简称“金风慧能”&#xff09;&#xff0c;共同发布了新能源场站集控中心的创新解决方案。该方案深度融合了浪潮信息的前沿服务器技术、软硬件一体化超融合方案及边缘计算产品与金风慧能自主研发的GW SCADA S…

C++进阶:多态

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态。 编译时多态(静态多态)主…

车机中 Android Audio 音频常见问题分析方法实践小结

文章目录 前言1. 无声2. 断音3. 杂音4. 延迟播放5. 焦点问题6. 无声问题(连上 BT )其他完善中…… 前言 本文主要总结了一下车机开发中遇到的 Audio 有关的问题&#xff0c;同时参考网上的一案例&#xff0c;由于Audio 模块出现音频问题的场景很多&#xff0c;对每一个出现的问…

气压测试实验(用IIC)

I2C: 如果没有I2c这类总线&#xff0c;连接方法可能会如下图&#xff1a; 单片机所有的通讯协议&#xff0c;无非是建立在引脚&#xff08;高低电平的变换高低电平持续的时间&#xff09;这二者的组合上&#xff0c;i2c 多了一个clock线&#xff0c;负责为数据传输打节拍。 (i2…

linux-L3-linux 复制文件

linux 中要将文件file1.txt复制到目录dir中&#xff0c;可以使用以下命令 cp file1.txt dir/复制文件 cp /path/to/source/file /path/to/destination移动 mv /path/to/source/file /path/to/destination复制文件夹内的文件 cp -a /path/to/source/file /path/to/destinati…

【刷题】Day3--错误的集合

hello&#xff01;又见面啦~~~ 一道习题&#xff0c;要长脑子了...... 【. - 力扣&#xff08;LeetCode&#xff09;】 【思路】 /*** Note: The returned array must be malloced, assume caller calls free().*/void Bubble_sort(int arr[], int size) {int temp;for (int i…

校园安全无小事,EasyCVR视频综合管理平台助力智慧校园视频监控系统全面升级

随着信息技术的飞速发展&#xff0c;智慧校园作为教育信息化的重要载体&#xff0c;正逐步成为提升校园安全管理、优化教育资源配置、增强师生互动体验的关键手段。其中&#xff0c;高效、智能的视频监控系统作为智慧校园不可或缺的一部分&#xff0c;扮演着至关重要的角色。TS…

视频推拉流/直播点播EasyDSS平台安装失败并报错“install mediaserver error”是什么原因?

TSINGSEE青犀视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可…

《OpenCV计算机视觉》—— 图像金字塔

文章目录 什么是图像金字塔&#xff1f;一、定义与基本原理二、主要类型三、构建过程四、应用领域 图像金字塔中的下采样和上采样一、下采样&#xff08;Downsampling&#xff09;二、上采样&#xff08;Upsampling&#xff09;三、总结 代码实现 什么是图像金字塔&#xff1f;…

linux---压缩打包

linux打包和压缩文件和目录&#xff1a; 归档(打包)命令&#xff1a;tar 归档就是将多个文件或者目录打包成为一个文件&#xff0c;存放再磁盘中&#xff0c;方便文件或者目录丢失时&#xff0c;可以恢复。 归档文件名使用相对路径 &#xff08;注意区分归档文件和被归档文…

一家电子元件企业终止,业绩规模小,疑似通过收购调节收入利润

贝特电子终止原因如下&#xff1a;首先&#xff0c;报告期内贝特电子营收较低&#xff0c;收购东莞博钺股权可能构成重大资产重组&#xff0c;且假如扣除报告期内来自东莞博钺的净利润&#xff0c;贝特电子的净利润恐怕不符合深交所上市标准&#xff1b;其次&#xff0c;交易所…

QT之QML学习五:添加自定义Qml组件,以及组件管理

开发环境: 1、Qt 6.7.2 2、Pyside6 3、Python 3.11.4 4、Windows 10 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!!…

第四天旅游线路预览——从换乘中心到喀纳斯湖

第四天&#xff1a;从贾登峪到喀纳斯风景区入口&#xff0c;晚上住宿贾登峪&#xff1b; 换乘中心有4 路车&#xff0c;喀纳斯①号车&#xff0c;去喀纳斯湖&#xff0c;路程时长约5分钟&#xff1b; 将上面的的行程安排进行动态展示&#xff0c;具体步骤见”Google earth stu…

List<Map<String, Object>>汇总统计排序

开发环境&#xff1a;jdk 1.8 需求一&#xff1a; 1、统计每个小时(升序)不同事件的产品产量 2、统计不同事件&#xff08;OK 、NG&#xff09;的总产量 public static void main(String[] args) {//数据源List<Map<String, Object>> list new ArrayList<Map…

使用 PyCharm 新建 Python 项目详解

使用 PyCharm 新建 Python 项目详解 文章目录 使用 PyCharm 新建 Python 项目详解一 新建 Python 项目二 配置环境1 项目存放目录2 Python Interpreter 选择3 创建隔离环境4 选择你的 Python 版本5 选择 Conda executable 三 New Window 打开项目四 目录结构五 程序编写运行六 …

多人开发小程序设置体验版的痛点

抛出痛点 在分配任务时,我们将需求分为三个分支任务,分别由前端A、B、C负责: 前端A: HCC-111-实现登录功能前端B: HCC-112-实现用户注册前端C: HCC-113-实现用户删除 相应地,我们创建三个功能分支: feature_HCC-111-实现登录功能feature_HCC-112-实现用户注册feature_HCC-1…

uView使用心得

说实话我不爱用这个库&#xff0c;感觉很鸡肋&#xff0c;坑很多&#xff0c;可能没用习惯 picker选择器 绑定默认值是通过设置index&#xff0c;并且这个index需要通过api设置进去&#xff0c;设置defalutindex绑定值无效&#xff08;只有初始化可以&#xff0c;后面动态改变…

半导体制造技术中的沉积和驱入(Deposition and drive-in)过程

来源&#xff1a;半导体制造技术导论——萧宏 沉积和驱入过程 图5.34 硼掺杂工艺高温扩散炉系统示意图 图5.35 扩散掺杂工艺流程 图5.36 扩散工艺在超浅结深&#xff08;USJ&#xff09;上的应用

【物联网技术大作业】设计一个智能家居的应用场景

前言&#xff1a; 本人的物联网技术的期末大作业&#xff0c;希望对你有帮助。 目录 大作业设计题 &#xff08;1&#xff09;智能家居的概述。 &#xff08;2&#xff09;介绍智能家居应用。要求至少5个方面的应用&#xff0c;包括每个应用所采用的设备&#xff0c;性能&am…

【GPU版】Windows下PyTorch入门深度学习环境安装与配置

如果电脑有NVIDIA GPU显卡&#xff0c;看【GPU版本】&#xff1b;否则&#xff0c;看【CPU版本】 聊聊PyTorch和Tensorflow 它们都是python的库/包 pip3是给python3使用的&#xff0c;由于现在用的python基本上都是3以上版本&#xff0c;所以pip和pip3没有区别 聊聊Anacond…