给别人起绰号是件不好的事情,但是在程序设计中,给变量或参数起个绰号却会给我们带来一些方便。绰号,就是另一种称呼。绰号和本名都是指同一样东西,绰号也是个名称,所以它的命名规则其他的命名规则一样,详情可参见3.1。另外,“绰号”显然也不能和“本名”相同。
这种给变量起“绰号”的操作称为引用(Reference),“绰号”称为引用名。声明引用的语法格式为:
变量数据类型 &引用名=已声明的变量名;
我们对变量使用了引用以后,对引用的操作就如同对被引用变量的操作。这就好像叫一个人的绰号和叫一个人的本名有着同样的效果。在声明一个引用时,必须告知电脑到底是哪个变量被引用,否则这个“绰号”就显得有些莫名其妙了。
下面我们来看一段简单的程序:(程序6.5.1)
#include "iostream.h"
int main()
{
int a=2;
int &b=a;//给变量a起了个绰号叫b
cout <<"a=" <<a <<endl;
cout <<"b=" <<b <<endl;
a++;
cout <<"a=" <<a <<endl;
cout <<"b=" <<b <<endl;
b++;//对b的操作也就是对a的操作,所以b++就相当于a++
cout <<"a=" <<a <<endl;
cout <<"b=" <<b <<endl;
return 0;
}
运行结果:
a=2
b=2
a=3
b=3
a=4
b=4
我们在这个程序中,能够验证对引用的操作相当于对被引用变量的操作。或许你还没看出引用到底派了什么大用处,不过马上你就会恍然大悟了。
#include "iostream.h"
void swap(int x,int y);
int main()
{
int a=2,b=3;
swap(a,b);
cout <<"a=" <<a <<endl;
cout <<"b=" <<b <<endl;
return 0;
}
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
运行结果:
a=2
b=3
在以上这段程序中,swap函数的语句是我们熟悉的交换语句,可是为什么执行了这个swap函数以后,a和b的值并没有交换呢?
在6.2中,我们介绍过,函数是将实参的值赋给了形参。这就像本来我们想交换a碗和b碗里的水,调用了swap函数则是拿来了x碗和y碗,然后把a碗里的水分一点到x碗里,b碗里的水分一点到y碗里,再把x碗和y碗里的水交换。可是,这样的操作有没有将a碗里的水和b碗里的水交换呢?没有。而且,我们还知道,一旦函数运行结束,函数中定义的参数和变量就都会消失,所以就连x碗和y碗也都没有了。
问题到底在于哪里呢?在于我们传给函数的是“水”,而不是“碗”。如果我们直接把a碗和b碗交给函数,那么这个任务就能够完成了。下面我们就来看看如何把“碗”来传递给函数:(程序6.5.2)
#include "iostream.h"
void swap(int &x,int &y);//用引用传递参数
int main()
{
int a=2,b=3;
swap(a,b);
cout <<"a=" <<a <<endl;
cout <<"b=" <<b <<endl;
return 0;
}
void swap(int &x,int &y)//函数定义要和函数原型一致
{
int temp;
temp=x;
x=y;
y=temp;
}
运行结果:
a=3
b=2
如果我们把没有使用引用的参数认为是int x=a和int y=b(把变量a和变量b的值分别传给参数x和参数y),那么使用了引用的参数就是int &x=a和int &y=b了。也就是说x和y成为了变量a和变量b的“绰号”,对参数x和y的操作就如同对变量a和b的操作了
这种给变量起“绰号”的操作称为引用(Reference),“绰号”称为引用名。声明引用的语法格式为:
变量数据类型 &引用名=已声明的变量名;
我们对变量使用了引用以后,对引用的操作就如同对被引用变量的操作。这就好像叫一个人的绰号和叫一个人的本名有着同样的效果。在声明一个引用时,必须告知电脑到底是哪个变量被引用,否则这个“绰号”就显得有些莫名其妙了。
下面我们来看一段简单的程序:(程序6.5.1)
#include "iostream.h"
int main()
{
int a=2;
int &b=a;//给变量a起了个绰号叫b
cout <<"a=" <<a <<endl;
cout <<"b=" <<b <<endl;
a++;
cout <<"a=" <<a <<endl;
cout <<"b=" <<b <<endl;
b++;//对b的操作也就是对a的操作,所以b++就相当于a++
cout <<"a=" <<a <<endl;
cout <<"b=" <<b <<endl;
return 0;
}
运行结果:
a=2
b=2
a=3
b=3
a=4
b=4
我们在这个程序中,能够验证对引用的操作相当于对被引用变量的操作。或许你还没看出引用到底派了什么大用处,不过马上你就会恍然大悟了。
用引用传递参数
其实引用最有用的地方还是在函数当中,下面我们先来看一个简单的例子:#include "iostream.h"
void swap(int x,int y);
int main()
{
int a=2,b=3;
swap(a,b);
cout <<"a=" <<a <<endl;
cout <<"b=" <<b <<endl;
return 0;
}
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
运行结果:
a=2
b=3
在以上这段程序中,swap函数的语句是我们熟悉的交换语句,可是为什么执行了这个swap函数以后,a和b的值并没有交换呢?
在6.2中,我们介绍过,函数是将实参的值赋给了形参。这就像本来我们想交换a碗和b碗里的水,调用了swap函数则是拿来了x碗和y碗,然后把a碗里的水分一点到x碗里,b碗里的水分一点到y碗里,再把x碗和y碗里的水交换。可是,这样的操作有没有将a碗里的水和b碗里的水交换呢?没有。而且,我们还知道,一旦函数运行结束,函数中定义的参数和变量就都会消失,所以就连x碗和y碗也都没有了。
问题到底在于哪里呢?在于我们传给函数的是“水”,而不是“碗”。如果我们直接把a碗和b碗交给函数,那么这个任务就能够完成了。下面我们就来看看如何把“碗”来传递给函数:(程序6.5.2)
#include "iostream.h"
void swap(int &x,int &y);//用引用传递参数
int main()
{
int a=2,b=3;
swap(a,b);
cout <<"a=" <<a <<endl;
cout <<"b=" <<b <<endl;
return 0;
}
void swap(int &x,int &y)//函数定义要和函数原型一致
{
int temp;
temp=x;
x=y;
y=temp;
}
运行结果:
a=3
b=2
如果我们把没有使用引用的参数认为是int x=a和int y=b(把变量a和变量b的值分别传给参数x和参数y),那么使用了引用的参数就是int &x=a和int &y=b了。也就是说x和y成为了变量a和变量b的“绰号”,对参数x和y的操作就如同对变量a和b的操作了
声明引用的语法格式为:
变量数据类型 &引用名=已声明的变量名;
变量数据类型 &引用名=已声明的变量名;
这个和C#的ref与OUT其中有什么奥秘?