//使用引用来完成参数值的交换。
temp = x;
x = y;
y = temp;
}
这个程序的输出和上一个版本的输出结果是一样的。再次提醒,因为 x,y 都是引用参数,所以我们
在交换值的时候不需要使用*运算符。请记住:在调用函数 swap()的时候,编译器会自动地传入实
参的地址。
我们复习一下前面的内容。当创建了引用参数的时候,参数会自动地表示对传入实参的引用。进
一步来说,调用该函数的时候没有必要使用&运算符。同样,在该函数的内部,我们直接使用引用
参数,而不用使用*运算符。在函数中所有对于引用参数的操作都会自动转换为对传入实参的操作。
最后,当我们在给引用参数赋值的时候,我们实际上是给它指向的对象进行赋值。
最后一点,C 语言是不支持引用的。因此,在 C 语言中使用指针是实现传引用的唯一方式,就像
我们在 swap()函数的第一个版本的那样。当需要把 C 代码转换为 C++代码的时候,我们可能需要
把这种代码转换为引用参数的方式。
专家答疑
问:
在一些 C++的代码中,我看到一些变量在声明的时候,&是和变量的类型结合在一起的,而不是和
变量自身结合在一起的,如下所示:
int& i;
而不是:
int &i;
这两种方式有区别吗?
答:
简而言之,是没有区别的。比如,我们也可以采用如下的方式来声明 swap()函数的原型:
void swap( int& x, int& y);
正如我们所看到的那样,&是紧跟在 int 的后面,而不是紧密地写在了 x 的前面。更有甚者,一些程
序员也会把声明指针的*紧密跟在类型的后面,而不是写在变量名称的前面,如下:
7oat* p;
这种写法反映出了 C++程序员试图创建一个单独的引用或者指针类型的良好愿望。然而这种写法存
在一个问题。那就是,根据 C++的语法,&和*是不能作用于一系列变量的。例如下面的声明方式
声明的是一个 int 类型的指针,而不是两个:
int* a,b;
这里,b 是一个 int 类型的变量,而不是一个 int 类型的指针变量。这是因为,根据 C++语法,当
在声明中使用*或者&得时候,它们是和其后的单个变量相关联的,而不是和前面的类型相关联的。
需要明确的是,就 C++编译器而言,我们到底是写 int *p 还是 int* p 并不重要。因此,如果你个
人喜欢把*和&紧密地和类型写在一起,而不是和变量的名称写在一起的话,你完全可以这样做的。
然而,为了避免混淆,本书中我们将始终把*和&写在它们所修饰的变量名称的前面,而不是紧跟在
类型的后面。
练习:
1. 如何声明引用参数?
2. 当调用使用引用参数函数的时候,我们必须在传入参数的前面使用&吗?