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++的课堂,未来我们一同前行!!!

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度剖析图像处理—边缘检测

什么是边缘检测 边缘检测(Edge Detection)就是提取图像中的边缘点(Edge Point)。边缘点是与周围像素相比灰度值有阶跃变化或屋顶状变化的像素。边缘常存在于目标与背景之间、目标与目标之间、目标与其影子之间。 ​ 在图像处理和图像分析中&#xff0c;经常要用到边缘(Edge)、边…

【学习】对于加密接口、签名接口如何进行性能测试

随着科技的飞速发展&#xff0c;加密接口和签名接口在我们的日常生活中扮演着越来越重要的角色。从在线支付到信息安全&#xff0c;它们始终默默地守护着我们的数字世界。然而&#xff0c;随着应用场景的不断扩展&#xff0c;性能测试变得尤为重要。今天&#xff0c;让我们一起…

单例模式与反射创建对象

单例模式 饿汉式单例模式 单例模式&#xff0c;就是自己先把自己创建了&#xff0c;整个程序都只有这一个实例&#xff0c;别人都没有办法创建实例&#xff0c;因为他的构造方法是private的 一次性把全部都创建了 public class HungryMan {private static int [][] s new …

[lesson48]同名覆盖引发的问题

同名覆盖引发的问题 父子间的赋值兼容 子类对象可以当做父类对象使用(兼容性) 子类对象可以直接赋值给父类对象(<font color>兼容性)子类对象可以直接初始化父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象 当使用父类指针(引用)指向子类对象时 子类…

安装zabbix server

目录 1、实验环境 2、yum 安装zabbix server 2.1 解决权限问题和放行流量 2.2 安装zabbix-server 1、实验环境 操作系统rhel8zabbix6.0TLS数据库mysql8.0.30IP地址192.168.81.131时间配置NTP时间服务器同步 2、yum 安装zabbix server 如果通过yum源安装&#xff0c;操作系…

《ElementUI 基础知识》png 图片扩展 icon用法

前言 UI 设计给的切图是 .png 格式。但想与 Element UI icon 用法类似&#xff0c;方案如下。 实现 步骤一 准备图片 步骤二 新建文件&#xff0c;可使用 CSS 预处理语言 styl 或 scss。 stylus 方式 文件 icon.styl /* 定义一个混合 */ cfgIcon(w, h) {display: inlin…

滑动窗口做题思路

什么是滑动窗口&#xff1f;就是一个队列,然后通过在这个队列中的各种移除和添加满足题目需求 题目: 209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int minSubArrayLen(int target, int[] nums) {int left 0;int sum 0;int n nu…

面向对象设计与分析40讲(25)中介模式、代理模式、门面模式、桥接模式、适配器模式

文章目录 门面模式代理模式中介模式 之所以把这几个模式放到一起写&#xff0c;是因为它们的界限比较模糊&#xff0c;结构上没有明显的差别&#xff0c;差别只是语义上。 这几种模式在结构上都类似&#xff1a; 代理将原本A–>C的直接调用变成&#xff1a; A–>B–>…

Java面试八股之marshalling和demarshalling

marshalling和demarshalling Marshalling&#xff08;序列化&#xff09;是将内存中的对象状态转化为适合传输或存储的格式&#xff08;如字节流、JSON、XML&#xff09;&#xff0c;以便进行网络通信、持久化存储或跨平台/语言交互操作。Demarshalling&#xff08;反序列化&a…

spring aop介绍

Spring AOP&#xff08;面向切面编程&#xff09;是一种编程范式&#xff0c;它允许开发者将横切关注点&#xff08;cross-cutting concerns&#xff09;从业务逻辑中分离出来&#xff0c;从而提高代码的模块化。在传统的对象导向编程中&#xff0c;这些横切关注点&#xff0c;…

【分治】Leetcode 颜色分类

题目讲解 75. 颜色分类 这道题的本质就是数组分三块 算法讲解 使用三个指针&#xff0c;i遍历数组&#xff0c;left标记0的最右侧&#xff0c;right标记2的最左侧 如果当前的nums[i] 0,我们就让nums[left] 和 nums[i]位置上的数字做交换&#xff0c;这里的i是可以向前移…

基于51单片机的宠物自动喂食语音播报,有实物

1. 51仿真&#xff1a; LCD第一屏显示食物重量&#xff0c;当前时间&#xff0c;温湿度。第二屏显示喂食时间&#xff0c;第三屏显示喂食重量。可通过点击查看喂食时间翻转屏幕显示。 点击查看喂食时间后&#xff0c;显示喂食时间&#xff0c;可以设置三个时间&#xff0c;再点…

【做一名健康的CSDNer】程序员哪几种行为最伤肾(程序员必看)

虽然没有专门针对程序员这一职业群体特有的伤肾行为的研究报道&#xff0c;但根据一般人群的健康风险和生活习惯&#xff0c;程序员由于其特殊的工作模式和环境&#xff0c;可能更容易出现如下伤肾的行为&#xff1a; 熬夜加班&#xff1a; 程序员由于项目进度、bug修复等原因&…

面试十八、容器适配器

容器适配器是一种特殊类型的容器&#xff0c;它们提供了一种不同于常规容器的接口和行为。容器适配器通常是建立在其他容器之上&#xff0c;通过改变接口或添加限制来满足特定的需求或解决特定的问题。 在 C 中&#xff0c;标准库提供了三种常见的容器适配器&#xff1a; 栈&am…

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

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

用户成功故事汇源达投顾选股软件见证智 慧投资的辉煌篇章

在投资领域&#xff0c;每一个成功的投资者背后&#xff0c;往往都有一款值得信赖的选股软件作为他们的得力助手。而河北源达的“财源滚滚”选股软件&#xff0c;正是这样一款备受投资者赞誉的智能投资工具。今天&#xff0c;我们就来分享一些使用财源滚滚选股软件获得成功的用…

【数学建模】虫子追击问题(仿真)

已知 有四个虫子,分别是 A , B , C , D A,B,C,D A,B,C,D A , B , C , D A,B,C,D A,B,C,D分别在 ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) , ( 1 , 0 ) (0,0),(0,1),(1,1),(1,0) (0,0),(0,1),(1,1),(1,0)四个虫子A追B&#xff0c;B追C&#xff0c;C追D&#xff0c;D追A四个速度相同 …

【UnityShader】图片圆角

1.需求 我们在开发的时候&#xff0c;有时候一些按钮或者菜单栏的边角是直角的需要改成圆角&#xff0c;但是让美术重新绘制耽误时间不说也确实没必要&#xff0c;这个时候我们不妨使用一个简单的shader去解决这个问题&#xff0c;下面我们就讲讲这个shader要如何实现。 需求1…

【智能算法】闪电搜索算法(LSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2015年&#xff0c;H Shareef等人闪电自然现象启发&#xff0c;提出了闪电搜索算法&#xff08;Lightning Search Algorithm, LSA&#xff09;。 2.算法原理 2.1算法思想 LSA受到闪电梯级先导传…

c++取经之路(其七)——c++的内存管理new与delete

c的基本的内存管理一般就是用new和delete来管理 new与delete&#xff1a; 我们直接来将用法&#xff0c;我一般用new有两种用法&#xff0c;一种只申请一个这样的数据&#xff0c;另一种是申请多个这样的数据&#xff0c;比如我们要申请一个int&#xff0c;和申请十个int&…