8.7 传引用调用
最后更新于:2022-04-01 06:21:48
C++中另一种可选择的参数传递机制被称为"传引用调用"。这种机制使得我们能传递一个结构体给程序并修改它。
例如,你可以通过交换两个坐标来得到某个点关于45度线的对称点。reflect函数最明显(但不正确)的写法是:
~~~
void reflect (Point p) //错误!!
{
double temp = p.x;
p.x = p.y;
p.y = temp;
}
~~~
这么写并不奏效,因为我们在reflect函数中所做的改变并不会影响调用者。
相反,我们必须指明要通过引用传递参数。为参数声明加上一个符号(&)即可。
~~~
void reflect (Point& p)
{
double temp = p.x;
p.x = p.y;
p.y = temp;
}
~~~
现在我们以普通方式调用这个函数:
~~~
printPoint(blank);
reflect(blank);
printPoint(blank);
~~~
程序输出与预期相符:
~~~
(3,4)
(4,3)
~~~
下图展示了我们为程序绘制的栈图:
![enter image description here](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-09-01_55e599952d35e.jpg)
参数p是blank结构的一个引用。引用通常用一个带箭头的点表示,箭头指向引用所指。
图中最重要的是要看到:引用对p做的任何改变同样会影响blank。
通过引用传递结构比按值传递更通用,这是因为被调用者也能修改结构。此外,由于系统不需要复制整个结构,这使得引用传递更快。另一方面,它的安全性下降了,因为很难追踪结构是在哪被修改的。尽管如此,在C++程序中,几乎所有的结构都是按引用传递的。本书中我会遵循这一习惯。