初谈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

目录
相关文章
|
5月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
38 3
|
5月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
6月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
69 5
|
6月前
|
C++
C++引用
C++引用
|
5月前
|
C++
C++基础知识(二:引用和new delete)
引用是C++中的一种复合类型,它是某个已存在变量的别名,也就是说引用不是独立的实体,它只是为已存在的变量取了一个新名字。一旦引用被初始化为某个变量,就不能改变引用到另一个变量。引用的主要用途包括函数参数传递、操作符重载等,它可以避免复制大对象的开销,并且使得代码更加直观易读。
|
5月前
|
存储 自然语言处理 编译器
|
5月前
|
安全 C++
|
6月前
|
C++
C++对C的改进和拓展\引用
C++对C的改进和拓展\引用
28 0