void addOne(int &y)
{
y = y + 1;
}
int main()
{
int x = 5;
std::cout << "x = " << x << '\n';
addOne(x);
std::cout << "x = " << x << '\n';
return 0;
}
很抱歉,如果这是一个基本问题。但为什么y = y + 1是6?
答案 0 :(得分:2)
最初可能有用的是将引用视为指针的语法糖。
请考虑以下事项:
int main() {
int x = 5;
int *px = &x;
*px = 8;
cout << x << endl;
return 0;
}
这会打印出8
,正如您所料。 (如果你没想到那么在处理引用之前可能值得阅读introduction to pointers。)
然后,引用变量可以被认为是指针变量,其语法是常规变量的语法。以下内容与前一个示例相同:
int main() {
int x = 5;
int &rx = x;
rx = 8;
cout << x << endl;
return 0;
}
也就是说,rx
成为对 x
的引用,因此每当您更改rx
时,您也会更改x
,因为这两个名称指的是同一个东西......换句话说,rx
绑定到内存位置,不一个值,并设置{{1更改该内存位置的内容。
从某种意义上说,rx
有点不可见 - 它没有自己的存在,它只存在于rx
的范围内(这就是为什么你必须初始化一个声明它时的引用,即你不能在一个函数中执行x
并让它挂起来。
所以当你有:
int ℞
这是一个函数,其参数是传递的内容的引用 ...因此,当参数引用发生更改时,引用所引用的引用也会发生变化。
所以当你这样称呼时:
void addOne(int &y)
{
y = y + 1;
}
这会将int main()
{
int x = 5;
std::cout << "x = " << x << '\n';
addOne(x);
std::cout << "x = " << x << '\n';
return 0;
}
与addOne
联系起来,从而将x
引用int &
初始化为y
,因此每当更改x
时,{ {1}}已更改...因此y
从x
更改为x
,即5
。
您可以将其视为与以下内容等效:
5 + 1
要了解您使用引用与指针的原因,请参阅this question。
答案 1 :(得分:1)
引用不是一个自变量,你应该认为字面上是另一个。因此,当您将x传递给函数addOne时,名为y的引用将逐字地变为x(这在屏幕后面如何工作现在不那么重要了)。
因此,当你将y增加1时,你真正在做的是增加x。在调用addOne之后,这就是为什么x是6的原因。