C++初阶学习第二弹——C++入门(下)

C++入门(上):C++初阶学习第一弹——C++入门(上)-CSDN博客

目录

一、引用

1.1 引用的实质

1.2 引用的用法

二、函数重载

三、内敛函数

四、auto关键字

五、总结


前言:

在上面一章我们已经讲解了C++的一些基本语法和命名空间缺省参数的概念,今天这篇,我们将重点讲解C++引用函数重载内敛函数的知识,以及一些其他的有别于c语言的小知识

一、引用

1.1 引用的实质

在我们使用C语言时,遇到一个需要传参的函数时,经常要用到指针这个概念,将一个数据的地址传过去,这样才能在函数中将这个数据进行修改,这个操作是有些繁琐的,在C++中,我们引入了引用的概念,接下来我们就讲解一下引用的用法

引用是对一个变量定义了一个新的名字,而不是定义了一个新的变量,引用的形式就是在一个类型后加一个&

int main()
{int a = 10;int& b = a;cout << a << endl;cout << b << endl;return 0;
}

运行结果:

如上所示,就可以看出引用的一部分特点,引用的实质实质上就是指针,都是对地址进行操作,上图中的例子,定义出的b和a指向的就是同一个空间,这点可以通过取双方的地址可以看出

int main()
{int a = 10;int& b = a;cout << a << endl;cout << b << endl;cout << &a << endl;cout << &b << endl;return 0;
}

运行结果:

也就是说,a和b是指向同一片空间的

1.2 引用的用法

所有就有许多有趣的操作可以进行,例如我们可以用引用来修改原来值,做参数,做返回值等等

先来看一点引用需要注意的点:

1. 引用在 定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
1、引用修改原来值
int main()
{int a = 10;int& b = a;b = 20;cout << a << endl;cout << b << endl;return 0;
}

2、引用做参数

void Func(int& b)
{b = 20;
}
int main()
{int a;Func(a);cout << a << endl;return 0;
}

3、引用做返回值

int& Func()
{int a = 10;int& b = a;return b;
}
int main()
{cout << Func() << endl;return 0;
}

二、函数重载

C++相比于C语言还有一个很大的创新就是支持函数重载,简单点说就是不同的函数可以有同一个名字,满足下面条件其中一个即可:

1、参数类型不同

int Add(int x, int y);
double Add(double x,double);

2、参数个数不同

int Add(int a, int b);
int Add(int a, int b, int c);

3、参数顺序不同

int Add(int a, double b);
int Add(double a, int b);

其实函数重载的本质就是函数在预处理、编译、汇编、链接这几步中连接这一步进行操作的,因为我们在调用一个函数时是要到符号表中找到该函数的定义的,不同的函数的在汇编中的名字就不同,所以我们就可以对这些名字相同,但是参数有差异的函数在汇编中按一定规则起不同的名字,从而达到让编译器知道该调用哪个函数的目的

应用实例:

int Add(int x, float y)
{return x + y;
}
double Add(double x, int y)
{return x + y;
}
int main()
{int a = 10;float b = 20.1;cout << Add(a, b) << endl;cout << Add(b, a) << endl;return 0;
}

运行结果:

三、内敛函数

内敛函数是将函数在在内敛函数调用的地方直接进行展开,不需要再建立栈帧,从而提高了程序的效率,它的使用方法就是在函数的声明和定义前面加一个inline

我们可以借助一下VS观察一下内联函数的展开是什么意思

首先,我们来看一下普通的函数调用是如何进行的,比如:

int Add(int x, int y)
{return x + y;
}
int main()
{int x = 1, y = 2;int c = Add(x, y);cout << c << endl;return 0;
}

而对于内敛函数,则可以在遇到时直接进行展开,不需要再去找Add的位置再去调用它:

inline int Add(int x, int y)
{return x + y;
}
int main()
{int x = 1, y = 2;int c = Add(x, y);cout << c << endl;return 0;
}

内敛函数的这种用法在很大程度上提高了程序的效率,因为我们在调用这些函数的时候不需要每次都去在栈区开辟空间,但这种用法实质上是以空间换时间,因为我们通过反汇编可以看出,它每一次都在原地进行展开实际上需要更大的空间,所以如果调用的函数过于复杂的时候,就算你写的是一个内敛函数,编译器也不会把它当内联函数对待

四、auto关键字

auto关键字是用来方便我们定义变量的,它的用法就是将一个类型过长或者位置类型的变量通过auto来定义,编译器会根据实际情况自行处理

1、类型过长

std::map<std::string, std::string>::iterator a;
auto b = a;

2、未知类型

auto a;

我们在写代码时恰当的使用auto来定义函数,能够很大程度上简化我们的代码,尤其是类型过长的时候

但我们需要注意:

1、auto不能做函数参数

void Func(auto a)
{    }

2、auto不能直接用来定义数组

void TestAuto()
{int a[] = {1,2,3};auto b[] = {4,5,6};
}

五、总结

C++的入门知识讲到这里就差不多了,本篇的重点是引用和函数重载,这两个内容在我们后面学习类与对象时会经常用到,强烈建议大家多去学习一下,这些内容并不全,有些知识等我们以后慢慢接触吧,总之,欢迎来到C++的课堂,未来我们一同前行!!!

谢谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!

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

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

相关文章

Vue2进阶之Vue2高级用法

Vue2高级用法 mixin示例一示例二 plugin插件自定义指令vue-element-admin slot插槽filter过滤器 mixin 示例一 App.vue <template><div id"app"></div> </template><script> const mixin2{created(){console.log("mixin creat…

【Java网络编程】TCP通信(Socket 与 ServerSocket)和UDP通信的三种数据传输方式

目录 1、TCP通信 1.1、Socket 和 ServerSocket 1.3、TCP通信示例 2、UDP的三种通信&#xff08;数据传输&#xff09;方式 1、TCP通信 TCP通信协议是一种可靠的网络协议&#xff0c;它在通信的两端各建立一个Socket对象 通信之前要保证连接已经建立&#xff08;注意TCP是一…

【Interconnection Networks 互连网络】Torus 网络拓扑

1. Torus 网络拓扑2. Torus 网络拓扑结构References 1. Torus 网络拓扑 Torus 和 Mesh 网络拓扑&#xff0c;又可以称为 k-ary n-cubes&#xff0c;在规则的 n 维网格中包裹着 N k^n 个节点&#xff0c;每个维度都有 k 个节点&#xff0c;并且最近邻居之间有通道。k-ary n-c…

YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新![2024/4/21]

​ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 专栏介绍 YOLOv9作为最新的YOLO系列模型&#xff0c;对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

《HCIP-openEuler实验指导手册》1.3Apache动态功能模块加载卸载练习

1.3.1 配置思路 mod_status 模块可以帮助管理员通过web界面监控Apache运行状态&#xff0c;通过LoadModule指令加载该模块&#xff0c;再配置相关权限&#xff0c;并开启ExtendedStatus后&#xff0c;即可使用该模块。 1.3.2 配置步骤 检查mod_status模块状态&#xff08;使…

net模块

建立TCP的链接 1 发送消息的服务 2 接收消息 2 建立http的链接让浏览器进行访问 import net from netconst html <h1>TCP</h1>const respinseHeaders [HTTP/1.1 200 OK,Content-Type:text/html,Content-Length: html.length,\r\n,html]const http net.create…

RK3568 学习笔记 : u-boot 通过 tftp 网络更新 u-boot自身

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 AtomPi-CA1 使用 虚拟机 ubuntu 20.04 收到单独 编译 RK3568 u-boot 使用 rockchip Linux 内核的设备树 【替换】 u-boot 下的 rk3568 开发板设备树文件&#xff0c;解决 u-boot 下千兆网卡设备能识别但是无法 Pi…

Spring(下)

接上篇&#xff0c;从第八个问题讲起 八.Spring工厂创建复杂对象 1.什么是复杂对象 简单对象就是可以直接new出来的&#xff0c;也就是直接调用构造方法创建 所以复杂对象就是不能直接通过调用构造方法创建。就比如JDBC中的Connection 2.三种方法 &#xff08;1&#xff…

【华为 ICT HCIA eNSP 习题汇总】——题目集18

1、SSH默认工作使用的TCP端口号是&#xff08;&#xff09;。 A、20 B、21 C、22 D、23 考点&#xff1a;①传输层 ②应用层 解析&#xff1a;&#xff08;C&#xff09; SSH为建立在应用层和传输层上的安全协议&#xff0c;是对TCP/IP协议的传输层以上的SSH会话流程进行加密的…

必应搜索广告与谷歌搜索广告对比那个更好?

搜索引擎广告作为企业获取潜在客户的重要渠道之一&#xff0c;其效果直接关系到营销策略的成功与否。两大搜索引擎巨头——谷歌&#xff08;Google&#xff09;和必应&#xff08;Bing&#xff09;各自提供了广告平台&#xff0c;即谷歌广告&#xff08;Google Ads&#xff09;…

【Web】2022DASCTF X SU 三月春季挑战赛 题解(全)

目录 ezpop calc upgdstore ezpop 瞪眼看链子 fin#__destruct -> what#__toString -> fin.run() -> crow#__invoke -> fin#__call -> mix.get_flag() exp <?php class crow {public $v1;public $v2;}class fin {public $f1; }class what {public $a; }…

力扣hot100(python解析)

文章目录 13. 合并区间14. 轮转数组 13. 合并区间 合并区间 数组 排序 思路&#xff1a; 代码&#xff1a; class Solution:def merge(self, intervals):result []if len(intervals) 0:return result # 区间集合为空直接返回intervals.sort() # 默认按照区间的左边界进…

z3求解器脚本(CTF-reverse必备)

CTF-reverse中有一类题目是通过约束方程求解变量的值&#xff0c;然后转化为对应的ASCII码&#xff0c;最终获得flag&#xff0c;约束方程以及要求解的未知数往往非常多&#xff0c;因此手算十分不现实&#xff0c;借助python中的z3模块可以很快完成求解&#xff01; 下面是某道…

开始Java之旅

1.Java语言 java是一门优秀的程序设计语言&#xff0c;并且是一种半编译型&#xff0c;半解释型语言。 Java 语言源于 1991 年 4 月&#xff0c;Sun 公司 James Gosling博士 领导的绿色计划(Green Project) 开始启动&#xff0c;此计划最初的目标是开发一种能够在各种消费性电…

【分治算法】Hanoi塔问题Python实现

文章目录 [toc]问题描述Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 问题描述 设 a a a、 b b b、 c c c是三个塔座&#xff0c;开始时&#xff0c;在塔座 a a a上有一叠共 n n n个圆盘&#xff0c;这些圆盘…

最新免费 ChatGPT、GPTs、AI换脸(Suno-AI音乐生成大模型)

&#x1f525;博客主页&#xff1a;只恨天高 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容…

虚良SEO怎么有效的对百度蜘蛛权重优化?

人们交换链接通常首先要问的是你BR值是多少&#xff1f;国内搜索引擎来说以百度马首是瞻&#xff0c;无论seo还是竞价都看重的是百度&#xff0c;那么针对百度权重的优化就特别重要了。其实&#xff0c;百度权重是民间的一种说法&#xff0c;百度官方并没有认同这个数值&#x…

(回溯)记忆化搜索和dp

动态规划的核心就是 状态的定义和状态的转移 灵神 的 回溯改递归思路 首先很多动态规划问题都可以采用 回溯 的思想 回溯主要思想就是把 一个大问题分解成小问题 比如 采用子集类回溯问题中的核心思想-> 选或不选 或者 选哪个 记忆化搜索之后 我们可以发现 每个新节点依…

Oracle故障处理:ORA-00600错误处理思路

提前说明&#xff1a; 该故障&#xff0c;我只是旁观者。 但处理该故障的DBA工程师&#xff0c;思路很清晰&#xff0c;我非常受教&#xff01;在此也将经验分享。 目录 项目场景 问题分析 优化建议 项目场景 在某项目数据库运维群&#xff0c;有现场同事发了张报错截图如下…

代码学习记录49---单调栈

随想录日记part49 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.20 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;柱状图中最大的矩形 84.柱状图中最大的矩形 Topic184.柱状图中最大的矩形 题目&…