作用:给变量起别名
语法:数据类型 &别名 = 原名
示例:

  1. int a=10;
  2. int &b=a;

一、引用的注意事项

  • 引用必须要初始化
  • 引用初始化后就不能再发生改变了

示例:

#include <iostream>
using namespace std;
int main()
{
    int a = 10;
    int& b = a;
    int c = 20;
    b = c;
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
    cout << "c=" << c << endl;

    return 0;
}

结果:
image.png

二、引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化针针修改实参

示例:两数交换

#include <iostream>
using namespace std;
//值传递方式
void zhichuandi(int a, int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
    cout << "\t值传递交换后的结果:a= " << a << "  b= " << b << endl;
}
//地址传递方式
void dizhichuandi(int* a, int* b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
    cout << "\t地址传递交换后的结果:a= " << *a << "  b= " << *b << endl;
}
//引用传递方式
void yinyongchuandi(int& a, int& b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
    cout << "\t引用传递交换后的结果:a= " << a << "  b= " << b << endl;
}
int main()
{
    int a = 10, b = 20;
    cout << "交换前的结果:a= " << a << " b= " << b << endl;
    zhichuandi(a, b);         //值传递
    cout << "交换前的结果:a= " << a << " b= " << b << endl;
    dizhichuandi(&a, &b);     //地值传递
    cout << "交换前的结果:a= " << a << " b= " << b << endl;
    yinyongchuandi(a, b);     //引用传递
    cout << "引用地址传递后实参的值:a= " << a << " b= " << b << endl;
    return 0;
}

结果:
image.png

三、引用做函数的返回值

作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
用法:函数调用作为左值

示例:

#include <iostream>
#include "other.h"
using namespace std;
int& fun()
{
    static int a = 10;
    return a;
}
int main()
{
    int& b = fun();  
    cout << " b=" << b << endl;
    fun() = 1000;//函数可以做为左值调用
    cout << " b=" << b << endl;
    return 0;
}

结果:
image.png
注意:如果一个函数的返回值是引用的方式返回,那这个函数可以作为左值来使用

四、引用的本质

本质:引用的本质在C++内部实现是一个指针常量

讲解示例:

#include <iostream>
#include "other.h"
using namespace std;
void func(int& ref)       //发现是引用,转换为int * const ref=&a
{
    ref = 100;            //ref是引用,转换为*ref=100
}
int main()
{
    int a = 10;
    int& ref = a;          //自动转换为int * const ref=&a;指针常量是指针指向不可改,也说明为什么引用不可更改
    ref = 20;             //内部发现ref是引用,自动帮我们转换为*ref=20;
    cout << "a:" << a << endl;
    cout << "ref:" << ref << endl;
    func(a);
    cout << "a:" <<a << endl;
    return 0;
}

结果:
image.png

五、常量引用

作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参

示例:

先看一段代码,看是否合法

int& ret=10;

很明显,这个是不合法的,因为引用必须引用一块合法的内存空间,而10是常量,他不是内存空间,所以上边这段代码是有问题的,然而,我们再看下边这段代码:

const int& ret=10;

这段代码合法吗?事实证明是合法的,那为什么这段代码就合法了呢,原来,在引用的前边加上了const作为修饰的话,那编译器会自动将这段代码转化为:

int temp;
temp=10;
int& ret=temp;

编译器会自动给我们加上相当于temp的一个变量,然后再引用这个变量,这样就变得合法了。那像下面这样的写法正确吗?

int a=10;
const int& ref=a;

这样的写法也是错的,所以常量引用右侧一定是一个常量,他的作业主要用于修饰一个函数的形参,防止误操作,接下来我们写下这样几行代码:
示例:

#include <iostream>
#include "other.h"
using namespace std;
void func(const int& a)
{
    a = 10000;     //在这里编译器会提示错误!因为有const的修饰,所以a是不可修改的左值
    cout << "a的值为:" << a << endl;
}
int main()
{
    int a = 100;
    func(a);
    return 0;
}

结果:
image.png
在这里显示a无法被赋值,提示因为有const修饰,表示a是不可修改的左值
那我们删除掉a=10000这段代码以后的运行结果是:
结果:
image.png
**