初谈C++:引用-1

简介: 初谈C++:引用

前言


在学习C语言的时候会遇到指针,会有一级指针、二级指针…很容易让人头昏脑胀。在C++里面,引入了引用的概念,会减少对指针的使用。引用相当于给一个变量起了一个别名,比如“高总”指的是小编。


概述


引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。


类型& 引用变量名(对象名) = 引用实体

#include<iostream>
using namespace std;
int main()
{
  int a = 10;
  int& b = a;
  int& c = a;
  return 0;
}

调试过程中,发现引用变量的地址和引用实体的地址是相同的,也就是说引用实际上就是给一个变量起了一个别名。

注意引用类型必须和引用实体是同种类型的

引用和C语言中只针的操作其实差不多,我们在反汇编语言中可以看到:


引用特性


1. 引用在定义时必须初始化

int main()
{
  int a = 10;
  int& ra;   //错误语法
  return 0;
}

在这段代码中,int& ra没有初始化,编译器会报错

正确代码:

int main()
{
  int a = 10;
  int& ra = a;
  return 0;
}
  1. 一个变量可以有多个引用
int main()
{
  int a = 10;
  int& ra = a;
  int& rra = a;
  return 0;
}

上述代码中,rarra都是对变量a的引用。这是没有问题的,比如小编有不止一个外号。

  1. 引用一旦引用一个实体,再不能引用其他实体
int main()
{
  int a = 10;
  int temp = 20;
  int& ra = a;
  ra = temp;
  cout << ra << endl;
  cout << a << endl;
  return 0;
}

在这段代码中ra是变量a的引用,ra=temp是将temp的值赋给ra引用的实体,即a


应用场景


做参数


效果:

  1. 做输出型参数,形参的改变可以影响实参
  2. 减少拷贝,提高效率
void Swap(int& a,int& b)
{
  int tmp = a;
  a = b;
  b = tmp;
}
int main()
{
  int x = 0, y = 1;
  Swap(x, y);
  cout << x << " " << y << endl;
  return 0;
}

上述代码确实实现了交换两个数字的功能

形参a是对实参x的引用,和x表示同一块空间;形参b是对实参y的引用,和y表示的是用一块空间。所以,在函数内交换ab实际上就是在交换xy


做返回值


以前的传值返回:

int Add(int a, int b)
{
  int sum = a + b;
  return sum;
}
int main()
{
  int x = 4;
  int y = 3;
  int ans = Add(x, y);
  cout << ans << endl;
  return 0;
}

这里随着函数栈帧调用的结束,sum也会销毁。那为什么最后还能打印出最终结果?

对于这种传值返回,会有一个临时变量的生成,这种临时变量是用来存储返回值的,当返回值比较小的时候,这个临时变量就是寄存器。通过反汇编,我们可以看到:把sum值赋给了寄存器eax

以上是在局部变量中

那么以satic修饰的变量在静态区,此变量虽然不会随着调用函数的栈帧销毁而销毁,但是在传值返回的时候也会创建临时变量。

因此不难看出,传值返回都会生成一个中间变量。


初谈C++:引用-2

https://developer.aliyun.com/article/1433915?spm=a2c6h.13148508.setting.14.1d684f0eDlrRN4

目录
相关文章
|
30天前
|
存储 安全 C++
在C++指针和引用
在C++指针和引用
|
1月前
|
C++
如何在C++中实现cpp文件中引用另外一个cpp文件
如何在C++中实现cpp文件中引用另外一个cpp文件
|
25天前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
60 0
|
25天前
|
设计模式 算法 数据安全/隐私保护
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
25 0
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
|
25天前
|
存储 算法 编译器
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(一)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
36 0
|
24天前
|
监控 安全 算法
悬垂引用与临时对象在C++中的深入探讨: 风险、原因与预防策略
悬垂引用与临时对象在C++中的深入探讨: 风险、原因与预防策略
54 3
|
1月前
|
存储 安全 编译器
【C++入门(下篇)】C++引用,内联函数,auto关键字的学习
【C++入门(下篇)】C++引用,内联函数,auto关键字的学习
【C++入门(下篇)】C++引用,内联函数,auto关键字的学习
|
1月前
|
存储 自然语言处理 编译器
『C++成长记』C++入门—— 函数重载&引用
『C++成长记』C++入门—— 函数重载&引用
|
1月前
|
C++
C++系列十三:引用
C++系列十三:引用
|
1月前
|
安全 C++
c++d的引用做函数返回值项的语法
c++d的引用做函数返回值项的语法
8 0