引用

什么是引用?

  - 变量名:一段连续内存空间的别名
  - 引用:已定义变量的别名

引用的结构

类型 &引用名 = 目标变量名;

引用的注意事项

  - &在这里不再是取地址符号。而是引用符号。相当于&有了第二种用法
  - 引用的类型必须和其绑定的变量的类型相同
  - 声明引用的同时,必须对引用进行初始化;否则编译时会报错
  - 一旦绑定到某个变量之后,就不会再改变其指向

引用的本质

  C++中的引用本质上是一种被限制的指针。
    由于引用是被限制的指针,所以引用是占据内存的,占据的大小就是一个指针的大小。
    有很多的说法,都说引用不会占据存储空间,其只是一个变量的别名,但这种说法并不准确。
    引用变量会占据存储空间,存放的是一个地址,但是编译器阻止对它本身的任何访问,从一而终总是指向初始的目标单元。
    在汇编里, 引用的本质就是“间接寻址”。

引用的用法

引用作为函数参数

#include <iostream>

using std::cout;
using std::endl;

//此时,引用作为函数参数
// int &x = a
// int &y = b
void swap(int &x, int &y)
{
  int temp = x;
  x = y;
  y = temp;
}

int main()
{
  int a = 10;
  int b = 20;
  cout << "交换前" << endl;
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;

  swap(a, b);
  cout << "交换后" << endl;
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  return 0;
}
指针传递,引用传递,值传递浅析
  在没有引用之前。如果想通过形参改变实参的值,只有使用指针才能达到目的。但使用指针的过程中,不好操作,很容易犯错
  引用可以作为其他变量的别名而存在,可以使用引用来代替指针,因而具有更好的可读性与实用性
  采用值传递传递参数,系统会在内存中开辟空间来存储形参变量,并将实参变量的值拷贝给形参变量,即形参变量只是实参变量的副本
  当用引用作为函数的参数时,函数中的形参会被当成实参变量或对象的一个别名来进行使用,此时,对形参的各种操作实际上是对实参本身进行操作
  当用指针作为函数的参数时,需要为形参指针在内存中分配空间
  - 建议使用引用作为函数的形参,这样会大大提高函数的时空效率

引用作为函数的返回值

引用作为函数的返回值的语法样式
类型 &函数名(形参列表)
{
  //函数体
}
#include <iostream>

using std::cout;
using std::endl;

int func1()
{
  int temp = 10;
  return temp;
}

/*
int &func2()
{
  int temp = 20;
  return temp;
}
*/

/*
int &func3()
{
  int *p = new int(1);
  return *p;
}
*/

int main()
{
  int a = func1();
  //int b = func2();
  //int c = func3();
  cout << "a = " << a << endl;
  //cout << "b = " << b << endl;
  //cout << "c = " << c << endl;
  return 0;
}
引用作为函数的返回值的注意事项
  - 当以引用作为函数的返回值时,返回的变量其生命周期一定是要大于函数的生命周期的,即当函数执行完毕时,返回的变量还存在。
  - 不能返回局部变量的引用
      主要原因是局部变量在函数返回后被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态
  - 不能在函数内部返回new分配的堆空间变量的引用
      如果返回的引用只是作为一个临时变量出现。而没有被赋予一个实际的变量,那么该引用所在的空间就无法释放,会造成内存泄露

引用总结

  - 在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。
  - 用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。
  - 引用与指针的区别是,指针通过某个指针变量指向一个变量后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就目标变量的别名,对引用的操作就是对目标变量的操作
原文地址:https://www.cnblogs.com/xkyrl/p/14662720.html