嘉树的日志

C++ 引用

程序语言一般有两种解释维度

对于引用来说,这两种解释如下:

举个例子:

void Demo() {
    int a = 5;
    int &r = a;
    r = 10;
}

语义

r 是 a 的替身,对 r 进行任何操作,都会映射到 a 身上,相当于对 a 进行同样操作。

void Demo() {
    int a = 5;
    int *r = &a;
    *r = 10;
}

实现

r 是 a 的指针,初始化为 a 的地址,对 r 的操作都隐含了解指针操作,相当于对 a 进行同样的操作。

So, 为什么引入语义的概念?

答:为了引用传递这一语义。比如我们想交换两个变量的值。

void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void Demo() {
    int a = 2, b = 3;
    swap(&a, &b);
}
void swap(int &a, int &b) {
    int tmp = a;
    a = b;
    b = tmp;
}

void Demo() {
    int a = 2, b = 3;
    swap(a, b);
}

引用传递

语义

函数可以引用传递,传递的是变量“本身”,而不是值。

实现

函数栈只能进行值传递,因此通过传递参数的“地址值”到函数内部,再通过解指针的方式来操作栈外部的数据。