在C语言中通过指针(Pointer)可以间接获取、修改某个变量的值,在C++中使用引用(Reference)可以起到跟指针类似的功能。

1
2
3
int  age = 10;
// 定义变量age的引用变量rAge
int &rAge = age;

引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针。

引用的基本使用

引用相当于变量的别名,基本数据类型、枚举、结构体、指针、数组等可以有引用。

在定义一个引用变量的时候就必须初始化,一旦指向了某个变量,就不可以在改变,”从一而终”。

常引用

引用可以被const修饰,这样就无法通过引用修改数据了,这样的引用称之为常引用

1
2
3
int age = 10;
// 定义常引用变量rAge
const int &rAge = age;

const必须写在&符号的左边,才能算是常引用

常引用的特点

  • 可以指向临时数据(常量、表达式、函数返回值等)
  • 可以指向不同类型数据
  • 作为函数参数时(此规则也适用于const指针)
    • 可以接受const和非const参数(非const引用,只能接受非const实参)
    • 可以与非const引用构成函数重载
1
2
3
4
5
6
7
8
9
func(10, 12);

int num1 = 10;
int num2 = 12;
func(&num1, &num2);

void func(const int &a, const int &b) {

}

汇编角度看引用本质

上面说引用本质是指针,首先看下指针本质是如何修改指针所指向的空间。

1
2
3
int age = 5;
int *p = &age;
*p = 10;

上面的代码汇编指令

接下来在看下引用的汇编本质

1
2
3
int age = 5;
int &rAge = age;
rAge = 10;

从指针与引用从汇编角度看都是通过空间的地址修改数据,本质都是一样。