当前位置: 首页 > news >正文

C++——引用

目录

举个例子:

引用的基本特性

引用的定义语法如下:

1. 引用必须初始化:

2. 引用是别名:

3. 引用不能为空:

4. 引用不能重新绑定:

引用的使用场景

函数参数传递:

函数返回值:

引用 vs 指针


在 C++ 中,引用是一个非常重要的特性,它允许我们为变量创建一个别名引用本质上是一个已存在变量的另一个名字,通过引用可以直接操作原始变量,而不需要通过指针的间接访问。引用在函数参数传递、返回值优化等场景中非常有用。

举个例子:

引用是一个变量的别名

  • 别名 的意思是“另一个名字”。

  • 比如,你有一个朋友叫“张三”,他的小名是“小三”。无论是叫“张三”还是“小三”,都是在指同一个人。

  • 在 C++ 中,引用就是给变量起了一个“小名”,通过这个小名可以直接访问原始变量。

int a = 10;      // 定义一个变量 a(原始变量),值为 10
int &ref = a;    // 定义 ref 是 a 的引用(别名,也就是上面提到“小名”)
  • 这里,ref 就是 a 的别名。

  • 无论是操作 a 还是操作 ref,实际上都是在操作同一个变量。

 通过引用可以直接操作原始变量

  • 因为引用是变量的别名,所以通过引用可以直接修改原始变量的值。

  • 不需要通过指针的间接访问,也不需要拷贝数据。

int a = 10;      // 定义一个变量 a,值为 10
int &ref = a;    // 定义 ref 是 a 的引用ref = 20;        // 通过 ref 修改 a 的值
cout << a;       // 输出 20
  • 在上面的代码中:

    • ref = 20; 这行代码通过引用 ref 修改了变量 a 的值。

    • 最终,a 的值变成了 20

引用和原始变量共享同一块内存

  • 引用和原始变量实际上是同一个东西,只是名字不同。

  • 它们共享同一块内存地址,因此修改引用就是修改原始变量。

int a = 10;      // 定义一个变量 a,值为 10
int &ref = a;    // 定义 ref 是 a 的引用cout << &a << endl;    // 输出 a 的地址
cout << &ref << endl;  // 输出 ref 的地址(和 a 相同)
  • 在上面的代码中:

    • &a 是变量 a 的地址。

    • &ref 是引用 ref 的地址。

    • 你会发现,&a 和 &ref 的值是相同的,因为它们指向同一块内存。

引用的基本特性

引用的定义语法如下:

数据类型 &引用名 = 变量名;

1. 引用必须初始化

  • 引用在定义时必须初始化,且一旦初始化后,不能再绑定到其他变量。

    int a = 10;
    int &ref = a; // ref 是 a 的引用
  • int &ref:表示 ref 是一个 int 类型的引用。

  • = a:表示 ref 是 a 的别名。

2. 引用是别名

  • 引用和原始变量共享同一块内存地址,修改引用就是修改原始变量。

    int a = 10;
    int &ref = a;
    ref = 20; // 修改 ref 就是修改 a
    cout << a; // 输出 20

3. 引用不能为空

  • 引用必须绑定到一个有效的变量,不能像指针一样指向 nullptr

4. 引用不能重新绑定

  • 引用一旦初始化后,不能再绑定到其他变量。

    int a = 10;
    int b = 20;
    int &ref = a;
    ref = b; // 这是将 b 的值赋给 a,而不是将 ref 重新绑定到 b

引用的使用场景

函数参数传递

  • 引用可以作为函数参数,避免拷贝大对象,同时允许函数修改原始数据。

函数返回值

  • 引用可以作为函数返回值,避免返回值的拷贝。

setMaxData函数:

  • 接收两个整数的引用作为参数
  • 比较这两个整数
  • 返回较大的那个整数的引用(不是值,而是引用本身)

main 函数

  • 定义两个整数变量 a (10) 和 b (20)

  • 调用 setMaxData(a, b),这会返回 b 的引用(因为20 > 10)

  • 将100赋值给这个返回的引用,实际上就是给 b 赋值

  • 输出结果:a 仍然是10,b 现在是100

引用 vs 指针


http://www.mrgr.cn/news/95696.html

相关文章:

  • 【前端工程化】
  • (UI自动化测试web端)第二篇:元素定位的方法_name定位
  • 快速部署Samba共享服务器作为k8s后端存储
  • 3. 轴指令(omron 机器自动化控制器)——>MC_SetPosition
  • Python中json和jsonify的使用
  • 2025前端面试题记录
  • RabbitMQ八股文
  • 【解决方法】VMwareWorkstation无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。
  • Ubuntu部署Docker搭建靶场
  • 练习用Jupyter使用selenium【疑问未解决版】
  • 【MySQL】基本查询(表的增删查改+聚合函数)
  • PostgreSQL_数据使用与日数据分享
  • 网络层之IP协议
  • Pytorch中的torch.utils.data.Dataset 类
  • 开发中常用的设计模式 用法及注意事项【面试题】
  • Flink启动任务
  • 常考计算机操作系统面试习题(四)
  • 深圳问顶安全科技有限公司asktopsec是做什么的?
  • 3. 轴指令(omron 机器自动化控制器)——>MC_SetOverride
  • Android Token的原理和本地安全存储