《C和C++代码精粹》——1.6 引用

本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第1章,第1.6节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.6 引用

C和C++代码精粹
由于C函数的参数是按值传递的,若传递大型结构给函数,既费时又占用空间。大多数C程序员使用指针来代替按值传递,例如,如果struct Foo是一个大型记录结构,可以采用如下方法:

void f (struct Foo * fp)
{
/*通过fp来访问Foo结构*/
  fp->x=…
等等.
}```
当然,为了使用这个函数,必须传递Foo结构的地址:

struct Foo a;

f (&a);`
C++的引用机制是符号上的便捷,这样做可以减少采用指针变量的显式间接访问的烦恼。在C++上面的代码可以被描述为:

void f(Foo &fr)
{
/*直接访问Foo的成员*/
fr.x=…
等等.
}```
现在可以像这样调用f不使用地址操作符:

Foo a;
...
f(a);`
f原型里的&符号指导编译器通过引用来传递参数,这实际上为你处理了所有的间接访问。(对于Pascal程序员而言,引用参数等价于Var参数。)

引用调用意味着对函数参数所做的任何修改也会影响到主调程序中的原始参数。这就是说你可以编写一个实际运行的交换函数(而不是一个宏)(参见程序清单1.4)。如果不打算修改一个引用参数,就可以像我在程序清单1.1中所做的那样将它声明为常引用。常引用参数具有安全性、按值调用的符号方便性以及引用调用的有效性。

如程序清单1.5所示,也可以通过引用从函数中返回一个对象,在赋值语句的左边是一个函数调用,这看起来有些奇怪,但是这在运算符重载时是方便的(尤其是=和[ ])。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

上一篇:基于TensorFlow.js的JavaScript机器学习


下一篇:SQLite Expert字符间距过大的问题