c语言中,用户如果需要调用变量或者函数,经常使用指针。指针看起来很好用,但是往往容易出错,是一个危险的东西。c++中,引入了一个新的机制,即引用。
可以认为引用是个一个对象另起了一个名字,对这个引用的操作就是对原来对象的直接操作,因此,引用必须满足如下要求:
1.引用在创建时必须被初始化。这一点很好理解,你给一个对象起了一个新名字,如果不指明对象那岂不白起了吗。
如:int &r 错;int m; int &r = m 对 注意,这里的&只是起一个标识作用,并不是取地址。
2.声明了变量的引用,相当于变量有两个名称,对任何一个名称操作都是对变量的直接操作。
void swap(int &temp1, int &temp2) {//此处函数的形参temp1, temp2都是引用
int temp;
p=temp1; temp1=temp2; temp2=p;
}
int main( ){
int a = 1,b = 10;
cin>>a>>b; //输入a,b的值
swap(a,b); //直接以变量a和b作为实参调用swap函数
cout<<a<< ' ' <<b; //输出结果
}
这是原来c语言的一个经典程序,用来说明传递指针改变变量的值,而不能直接传递变量。这里使用引用也可以达到这种效果,不同的是不必再为形参分配空间,而是直接在变量上操作。如果用指针指向函数,还要为构造函数分配空间,用引用就可以剩下很多空间,而且可读性也更好。
3.引用能使用const来创建尽量使用const。
我认为这里是引用最精妙的地方。
以前用c指针的时候经常会发生同一个指针指来指去最后不知道指到哪里的现象,为了防止这样我们就要开辟很多新的指针。但这其实是一种很危险的行为,因为指针也是变量,也需要分配内存,这样很容易造成程序可读性差和出现问题。而引用呢,看下面的例子:
int main( string &s);
void f();
main(f()) 错;main(“123456”)错
因为如果传这两个变量就需要开辟临时空间,引用是拒绝它们的。这样就保证函数传入的参数必须是某一个已经定义了的变量,而且无论定义多少个引用也不会占用内存和引错引丢。
究其原因:
指针传递参数本质上是传递一个地址。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即开辟了内存空间存放由主调函数放进来的实参的值。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值,实参指针本身的地址值不会变。
在引用传递过程中,存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量,而且不会开辟多余内存。
4.返回引用函数类型时,没有复制返回值,返回的是对象本身;而返回非引用函数类型(就是我们常常写的那种),返回的是调用函数时创建的临时对象。,因此, 不要返回局部对象的引用,就和不要返回指向局部对象的指针一个道理。因为局部对象跳出函数后会释放,这样引用就没有对象,指针指向的对象也会被释放,造成内存泄漏。