codecamp

C++ 传引用调用

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++程序中,几乎所有的结构都是按引用传递的。本书中我会遵循这一习惯。

C++ 传值调用
C++ 使用结构体表示矩形
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }