第八十九天学习记录:C++核心:引用

news2024/9/20 18:58:52

引用的基本使用

作用:给变量起别名
语法:数据类型 &别名=原名

#include<iostream>
using namespace std;

int main()
{
	//引用基本语法
	//数据类型  &别名 = 原名

	int num1 = 3;
	int &num2 = num1;
	cout << "num1=" << num1 << endl;
	cout << "num2=" << num2 << endl;
	num2 = 30;
	cout << "num1=" << num1 << endl;
	cout << "num2=" << num2 << endl;
	return 0;
}

在这里插入图片描述

问:typdef在C语言是定义别名,但在C++还有用吗?C++可以用&来取别名
答:
在C++中,typedef仍然可用来定义类型别名。它的使用方式与C语言中相同。例如,你可以使用typedef来为一个复杂的数据类型创建一个更简洁的别名,以增加代码的可读性。

另外,在C++11之后,引入了更强大的类型别名机制,即使用关键字using。相比于typedef,using更灵活且易于使用。例如,你可以使用using来定义别名模板、别名函数指针等。

当然,在C++中,你也可以使用引用(&)来创建类型的别名。引用别名在某些情况下可以更直观地表示变量引用关系。例如,使用引用别名可以避免一些指针操作。但请注意,引用别名不同于类型别名,它更多地是用于引用变量的别名而不是类型本身的别名。

总而言之,尽管C++提供了更多强大的类型别名机制,但typedef在C++中仍然是有效的,并且可以根据具体情况选择合适的方式来定义类型的别名。

引用的注意事项

1、引用必须初始化
2、引用在初始化后,不可改变

	int a = 10;
	int &b = a;
	int c = 20;
	b = c;//此处为赋值操作,而不是更改引用

引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参

#include <iostream>
using namespace std;

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

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

void mySwap03(int &a, int &b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	//mySwap01(a, b);//值传递
	//mySwap02(&a, &b);//址传递
	mySwap03(a, b);//引用传递
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	return 0;
}

引用做函数返回值

作用:引用是可以作为函数的返回值存在的

注意:不要返回局部变量引用
用法:函数调用作为左值

#include
using namespace std;

int& test01()
{
int a = 10;
return a;
}

int& test02()
{
static int a = 10;//静态变量,存放在全局区
return a;
}

int main()
{
//int &ref = test01();
//cout << “ref=” << ref << endl;//第一次结果正确,是因为编译器做了保留
//cout << “ref=” << ref << endl;//第二次结果错误,因为a的内存已经释放
int &ref2 = test02();
cout << “ref=” << ref2 << endl;
cout << “ref=” << ref2 << endl;
cout << “ref=” << ref2 << endl;
test02() = 666;
cout << “ref=” << ref2 << endl;
cout << “ref=” << ref2 << endl;
return 0;
}

引用的本质

本质:引用的本质在C++内部实现是一个指针常量
在这里插入图片描述
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了

常量引用

作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参

问:为什么 int &a=10;会报错?
答:
在C++中,当我们使用引用时,引用必须被初始化为一个已经存在的对象。引用是一个别名,它必须引用一个实际存在的对象,而不能引用一个字面值或临时对象。
因此,当你尝试使用int &a = 10;这样的代码时,它会导致编译错误。因为10是一个字面值(常量),它并不是一个具体的、可修改的对象,所以不能将一个引用绑定到它上面。
如果你想使用引用来引用一个常量值,可以使用常量引用。常量引用可以绑定到一个字面值或常量,并且允许读取该值,但不允许修改它。下面是一个示例:

const int &a = 10;

在这个示例中,我们将一个常量引用绑定到了常量值10上,这是合法的。这意味着我们可以使用引用a来读取常量值10,但不能修改它。
总结:使用引用时,引用必须被初始化为一个已经存在的对象,因此不能将引用绑定到一个字面值或临时对象。如果需要引用常量值,可以使用常量引用。

#include <iostream>
using namespace std;

void showValue(const int &val)
{
	cout << "val=" << val << endl;
}

int main()
{
	//int &ref = test01();
	//cout << "ref=" << ref << endl;//第一次结果正确,是因为编译器做了保留
	//cout << "ref=" << ref << endl;//第二次结果错误,因为a的内存已经释放
	int a = 100;
	showValue(a);
	cout << "a=" << a << endl;
	return 0;
}

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

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

相关文章

输入路由器IP地址进入IIS问题解决

0x01 问题描述 Windows10系统&#xff0c;路由器IP为192.168.1.1&#xff0c;本机获取的IP为192.168.1.110&#xff0c;但在浏览器URL输入路由器IP时却没有进入路由登录页&#xff0c;而是进了IIS欢迎页面。 0x02 问题分析 由于我本机IP不是192.168.1.1&#xff0c;所以排除与…

第八十七天学习记录:Linux基础:基础指令Ⅱ

touch创建文件 可以通过touch命令创建文件 语法&#xff1a;touch Linux路径 1、touch命令无选项&#xff0c;参数必填&#xff0c;表示要创建的文件路径&#xff0c;相对、绝对、特殊路径符均可以使用 cat命令 查看文件内容 首先用Vim编辑器在刚刚新建的tanktest.txt中编辑…

MyBatis学习笔记--中篇

MyBatis学习 文章目录 MyBatis学习1、MyBatis 配置解析1.1、核心配置文件1.2、事务管理器&#xff08;transactionManager&#xff09;1.3、数据源&#xff08;DataSource&#xff09;1.4、属性&#xff08;properties&#xff09;1.5、类型别名&#xff08;typeAliases&#x…

1. AGPC-SLAM: Absolute Ground Plane Constrained 3D Lidar SLAM

AGPC-SLAM: Absolute Ground Plane Constrained 3D Lidar SLAM overview 关键思路 odom约束 回环检测约束 地面约束 总体约束 问题 地面约束似乎倾向于全部对齐到第一个平面&#xff0c;也就是说该方案假设了所有地面方程是同一个平面。后面的实验也验证了上述假设有问题&…

EfficientDet(EfficientNet+BiFPN)论文超详细解读(翻译+学习笔记+代码实现)

前言 在之前我们介绍过EfficientNet&#xff08;直通车&#xff1a;【轻量化网络系列&#xff08;6&#xff09;】EfficientNetV1论文超详细解读&#xff08;翻译 &#xff0b;学习笔记代码实现&#xff09; 【轻量化网络系列&#xff08;7&#xff09;】EfficientNetV2论文超详…

Linux:etc/group

etc/group文件中保存着系统中所有组的名称&#xff0c;以及每个组中的成员列表。 文件中的一行为一个组的信息&#xff0c;具体如下&#xff1a; 如果组口令字段为x的话&#xff0c;就还有一个etc/gshadow文件用于存放组口令。 GID用于标识一个组&#xff0c;应保证其唯一性。…

Spring Boot 中的事务回滚规则

Spring Boot 中的事务回滚规则 在应用程序中&#xff0c;事务管理是一个重要的概念。事务是指一系列的操作&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败。在Spring Boot中&#xff0c;我们可以使用事务管理器来管理事务。在使用事务管理器的时候&#xff0c;一个…

ElasticSearch——复合查询

Elasticsearch 语雀&#xff08;完整笔记&#xff09; 复合&#xff08;compound&#xff09;查询&#xff1a;复合查询可以将其它简单查询组合起来&#xff0c;实现更复杂的搜索逻辑。常见的有两种&#xff1a; fuction score&#xff1a;算分函数查询&#xff0c;可以控制…

《计算机系统与网络安全》第七章 身份认证

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【单片机】STM32单片机读取旋转编码器,TIM定时器捕获

文章目录 旋转编码器介绍主程序逻辑直接检测用外部中断检测下降沿定时器直接解码旋转编码器 旋转编码器介绍 旋转编码器简单来说&#xff0c;就是会输出2个PWM&#xff0c;依据相位可以知道旋转方向&#xff0c;依据脉冲个数可以知道旋转的角度。一般旋转一圈有一个固定数值的…

chatgpt赋能python:Python输出\n的用法及优势

Python 输出\n 的用法及优势 在Python编程语言中&#xff0c;我们常常需要输出字符串&#xff0c;并在特定地方换行。在这种情况下&#xff0c;使用\n是一种非常方便的方式。在本文中&#xff0c;我们将详细介绍Python的输出\n的用法及其优势。 什么是\n&#xff1f; \n是一…

Spark17-18-19

17. Spark执行流程 17.1 创建SparkContext 使用spark-submit脚本&#xff0c;会启动SparkSubmit进程&#xff0c;然后通过反射调用我们通过--class传入类的main方法&#xff0c;在main方法中&#xff0c;就行我们写的业务逻辑了&#xff0c;先创建SparkContext&#xff0c;向M…

YOLOv5-7.0添加BottleNet transformer

YOLOv5主干特征提取网络为CNN网络&#xff0c;CNN具有平移不变性和局部性&#xff0c;缺乏全局建模长距离建模的能力&#xff0c;引入自然语言领域的Transformer可以形成CNNTransFormer架构&#xff0c;充分结合两者的优点&#xff0c;提高目标检测效果。 1. BoTNet 论文地址…

BeautifulSoup爬取豆瓣电影数据

BeautifulSoup爬取豆瓣TOP250 豆瓣爬取地址 https://movie.douban.com/top250?formattext BeautifulSoup官网地址 https://www.rddoc.com/doc/BeautifulSoup/4.5.3/zh/quick-start/ 安装所需函数库 pip install beautifulsoup4pip install lxmlpip install requests导入…

IIS安装localhost显示下载,urlrewrite设置

1.取消ftp服务勾选 2. ping localhost ping 127.0.0.1 如果显示 &#xff1a;&#xff1a;1 则需要禁用ipv6 在注册表 找到并单击下面的注册表子项&#xff1a; HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\ 双击“DisabledComponents”以修…

Git2023最新版下载与安装教程(Windows版)

Windows版Git下载与安装教程 1. 下载Git2. 安装Git3. 配置Git 1. 下载Git 打开Git官网下载地址&#xff1a;https://git-scm.com/downloads 点击Download for Windows 选择git版本进行下载 2. 安装Git 双击安装包 点击Next 选择Git的安装路径&#xff0c;点击Next 选择…

【Html】js+css实现平滑滚动

效果 示例 <!DOCTYPE html> <html><head><title> Document </title><style>button{bottom: 0;position: fixed;z-index: 999;left: 0;background: rgb(94, 171, 255);border: 1px red;color: white;font-size: large;font-family: ;}img{…

C++、Redis读取base64格式的图像记录

C、Redis读取base64格式的图像记录 一、案例需求 1.另一台电脑利用C#和Redis将图像数据按照base64格式&#xff0c;存储在某一个key中 2.本机需要使用C和Redis将图像数据获取到&#xff0c;并写入本地。 环境&#xff1a;Ubuntu20、Redis、QT 二、Qt中的Pro文件配置 QT中的…

深度学习记录1(线性回归的实现)

1、整体思路 根据线性回归的定义&#xff0c; &#xff0c;建立线性回归模型&#xff0c;在损失函数的计算上&#xff0c;采用L2 Loss&#xff08;均方误差&#xff09;。同时&#xff0c;对于模型的优化采用随机梯度下降。 2、详细代码分析 import random import torch from…

Day7——Web安全基础下

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 回顾前言一、owasp top 10漏洞&#xff08;了解&#xff09;&#xff08;四年一更&#xff09;1.访问控制崩溃2.敏感数据暴露3.sql注入4.不安全的设计5.安全配置不当…