【C++】引用(reference)

embedded/2024/11/18 21:34:21/

引用是对一个变量或者对象取的别名

定义:真名的数据类型& 别名 = 真名;

既然是对一个变量或者对象取别名,那就得先有变量或对象,不能凭空取一个别名。也就是定义引用必须初始化。

  • 对引用的操作和对引用对应的变量的操作是完全等价的
  • 引用的类型必须和其所对应的变量的类型相同
  • 引用不是定义新的变量或对象,因此不会为引用开辟新的空间内存

示例:

#include<iostream>
using namespace std;
int main() {int a = 8;int& ref_a = a;ref_a++;cout << a << endl;//9
}

其实引用就是指针的语法糖(syntax sugar)

我们为什么要使用引用呢?我们干嘛要起个别名而不直接用真名呢?

假设我们想通过调用一个函数来实现一个整型变量的自增,有下面3种传递方式

值传递:形参的改变无法改变实参的值

void fun(int x) {x++;
}
int main() {int a = 8;fun(a);cout << a << endl;//8
}

地址传递:形参的改变可以改变实参的值

void fun(int* x) {(*x)++;//不加括号就会先自增再解引用
}
int main() {int a = 8;fun(&a);cout << a << endl;//9
}

引用传递:形参的改变可以改变实参的值

void fun(int& x) {x++;
}
int main() {int a = 8;fun(a);cout << a << endl;//9
}

是不是比使用指针更简洁些呢

那么,可不可以给引用取别名呢?答案是可以的

int a = 8;
int& a1 = a;
int& a2 = a1;//给引用取别名(引用的嵌套)
int& a3 = a;//同一个对象或变量可以取多个别名

引用和指针的区别

  1. 指针是另一个变量,而引用是自己本身,指针会占用额外存储空间,但引用不会占用额外存储空间,也就是说别名和真名是同一个东西,共享同一块内存
  2. 指针可以不用初始化赋值,但是引用必须初始化赋值
  3. 指针可以有多级指针,但是引用没有多级引用
  4. 指针可以改变指向,但是引用不能改变其所指代的变量或对象
  5. 指针是间接访问,引用是直接访问

关于指针的更多内容:【C语言】指针


http://www.ppmy.cn/embedded/138627.html

相关文章

C++: string(二)

✨✨ 欢迎大家来到我的文章✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 分类专栏&#xff1a;c 我的主页&#xff1a;tyler s blog 文章目录 一 string的成员函数1 insert2 resize3assign4erase5replace6 find(1) find(2)rfind…

用 Python 从零开始创建神经网络(八):梯度、偏导数和链式法则

梯度、偏导数和链式法则 引言1. 偏导数2. 和的偏导数3. 乘法的偏导数4. Max 的偏导数5. 梯度&#xff08;The Gradient&#xff09;6. 链式法则&#xff08;The Chain Rule&#xff09; 引言 在我们继续编写我们的神经网络代码之前&#xff0c;最后两个需要解决的难题是梯度和…

计算机网络 第二章:物理层

一、 基本概念 1.1 物理层作用、要解决的问题 第一章提到过&#xff0c;物理层要解决的问题是&#xff1a;用什么信号传输比特0和1&#xff1f; 现在的计算机网络有很多传输媒体&#xff0c;物理层的作用就是尽可能的屏蔽掉这些传输媒体的差异&#xff0c;这样就能更好地为数…

Node.js is Web Scale

点击“打开/下载题目”进去看看情况&#xff1a; 为了方便查看翻译成中文简体来看&#xff1a; emmm&#xff0c;看不懂什么意思&#xff0c;查看源代码&#xff0c;js表示是一段JavaScript代码&#xff0c;丢给AI分析一下&#xff1a; // server.js const express require(&…

【Linux:epoll】

目录 epoll与select、poll的区别&#xff1a; epoll操作函数&#xff1a; int epoll_create(int size); epoll_ctl: epoll_wait: epoll与select、poll的区别&#xff1a; select,poll底层是一个线性表的结构&#xff0c;而epoll是一个红黑树结构。epoll、poll不能跨平台…

CSS:导航栏三角箭头

用CSS实现导航流程图的样式。可根据自己的需求进行修改&#xff0c;代码精略的写了一下。 注&#xff1a;场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅&#xff0c;自行处理。有个方法是直接在每个外面包一个DIV&#xff0c;用动态样式设置底色。 场景一、…

【Qt】QtCreator安装安卓环境

1、简述 在QtCreator中安装安卓开发环境的步骤: 安装java安装安卓SDK安装android_openssl(非必须)2、安装java 2.1 版本要求 本人QtCreator版本为:Qt Creator 10.0.1;Qt版本为6.5 尝试java23,编译时失败; 尝试java19,编译成功; 未尝试java17(这个版本是长期支持版…

Executor和Service

Executor和Service是Android开发中两个重要的概念&#xff0c;它们都用于处理后台任务&#xff0c;但有着不同的用途和特点。让我们来详细比较一下&#xff1a; 1. Executor&#xff08;执行器&#xff09;&#xff1a; 定义&#xff1a;Executor是一个接口&#xff0c;用于管…