8.7 传引用调用

优质
小牛编辑
125浏览
2023-12-01

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

参数p是blank结构的一个引用。引用通常用一个带箭头的点表示,箭头指向引用所指。

图中最重要的是要看到:引用对p做的任何改变同样会影响blank。

通过引用传递结构比按值传递更通用,这是因为被调用者也能修改结构。此外,由于系统不需要复制整个结构,这使得引用传递更快。另一方面,它的安全性下降了,因为很难追踪结构是在哪被修改的。尽管如此,在C++程序中,几乎所有的结构都是按引用传递的。本书中我会遵循这一习惯。