引用变量
引用是已定义的变量的别名,主要用途是用作函数的形参。通过将引用变量作为形参可以直接使用原始数据而不是新建一个副本。
必须在声明引用变量的时候进行初始化
int rat;
int & rodent;
rodent = rat; //不可以这样做!
而应该这样
int rat;
int & rodent = rat; //正确!
交换两个变量的值
比较下面交换变量值的方法:
include<iostream>
//使用引用变量作为参数
void swap_a (int &a,int &b){
int temp;
temp = a;
a = b;
b = temp;
}
//使用指针作为参数
void swap_b(int *p,int *q){
int temp;
temp = *p;
*p = *q;
*q = temp;
}
//使用值作为参数
void swap_c(int m,int n){
int temp;
temp = a;
a = b;
b = temp;
}
int main(){
using namespace std;
int a = 1, b = 2;
//调用
swap_a(a, b);
cout << "a=" << a << ",b=" << b << endl;
a = 1, b = 2;
swap_b(&a, &b);
cout << "a=" << a << ",b=" << b << endl;
a = 1, b = 2;
swap_c(a, b);
cout << "a=" << a << ",b=" << b << endl;
return 0;
}
结果为:
a=2,b=1
a=2,b=1
a=1,b=2
所以引用和指针都可以成功交换两变量的值,按值传递不能交换。
避免返回一个函数终止时不再存在的内存应用
查看如下代码:
//返回参数的一个复制体
const stru & clone (stru & s){
stru newstru;
newstru = s;
return newstru;
}
当函数运行结束后,临时变量newstru的内存单元将会被释放,运行这段代码会出现编译警告,运行时会出现编译错误。
为避免这样的问题,可以返回一个作为参数传递给函数的引用,即
//返回参数的一个复制体
const stru & clone (stru & s){
stru & newstru;
newstru = s;
return newstru;
}
另一种方法是使用指针,即:
//返回参数的一个复制体
const stru & clone (stru & s){
stru *ps = NULL;
*ps = s;
return *ps;
}
小结
1. 使用引用参数的主要原因有两个:
(1)程序员能够修改调用函数中的数据对象;
(2)通过传递引用而不是整个数据对象,可以提高程序的运行速度;
2. 对于使用传递的值而不作修改的函数:
(1)如果数据对象很小,如内置数据类型或者小型结构,则按值传递;
(2)如果数据对象是数组,则使用指针。这是唯一的选择,并声明为const的指针;
(3)如果数据对象是较大的结构,则使用const指针或const引用,以提高程序的效率。这样可以节省复制结构所需的时间和空间;
(4)如果数据对象是类对象,则使用const引用。类设计的语义常常要求使用引用。因此,传递类对象参数的标准方式是按引用传递。
3. 对于修改函数中的数据的函数:
(1)如果数据对象是内置数据类型,则使用指针。如果看到诸如change(&x)这样的代码,则传递的是X的地址,函数将修改X的值;
(2)如果数据对象是数组,则只能使用指针;
(3)如果数据对象是结构体,则使用引用或指针;
(4)如果数据对象是类对象,则使用引用。