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

目录
相关文章
|
2天前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
41 9
|
2天前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
2天前
|
C++
c++引用是什么意思?
c++引用是什么意思?
6 2
|
2天前
|
C++
c++引用看这个就够了
c++引用看这个就够了
10 0
|
2天前
|
存储 安全 C++
深入理解C++中的指针与引用
深入理解C++中的指针与引用
11 0
|
2天前
|
编译器 C语言 C++
【C++入门】缺省参数、函数重载与引用(上)
【C++入门】缺省参数、函数重载与引用
|
2天前
|
编译器 C++
【C++进阶】引用 & 函数提高
【C++进阶】引用 & 函数提高
|
2天前
|
存储 人工智能 编译器
【重学C++】【引用】一文看懂引用的本质与右值引用存在的意义
【重学C++】【引用】一文看懂引用的本质与右值引用存在的意义
34 0
|
2天前
|
存储 安全 编译器
【C++成长记】C++入门 |函数重载、引用、内联函数
【C++成长记】C++入门 |函数重载、引用、内联函数
|
2天前
|
编译器 C++
C++ 解引用与函数基础:内存地址、调用方法及声明
C++ 中的解引用允许通过指针访问变量值。使用 `*` 运算符可解引用指针并修改原始变量。注意确保指针有效且不为空,以防止程序崩溃。函数是封装代码的单元,用于执行特定任务。理解函数的声明、定义、参数和返回值是关键。函数重载允许同一名称但不同参数列表的函数存在。关注公众号 `Let us Coding` 获取更多内容。
138 1