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);
}
引用传递
语义
函数可以引用传递,传递的是变量“本身”,而不是值。
实现
函数栈只能进行值传递,因此通过传递参数的“地址值”到函数内部,再通过解指针的方式来操作栈外部的数据。