在C++中,引用就是一个变量的别名,它需要用另一个变量或对象来初始化自身。引用就像一个人的外号一样,例如:有一个人,他的名字叫做张旭,因他在家排行老三,别人给他取了一个外号叫张三,这样,我们叫张三或张旭,指的都是同一个人。下面的代码声明了一个引用b,并用变量a进行了初始化。
- int a = 5;
- int &b = a; //用&表示申明一个引用。引用必须在申明时进行初始化
考虑下面代码:
- int a = 5;
- int &b = a;
- int c=3; //此处并不是将b变成c的引用,而是给b赋值,此时,b和a的值都变成了3
引用和用来初始化引用的变量指向的是同一块内存,因此通过引用或者变量可以改变同一块内存中的内容。引用一旦初始化,它就代表了一块特定的内存,再也不能代表其他的内存。
那么引用和指针变量有什么区别呢?
引用只是一个别名,是一个变量或对象的替换名称。引用的地址没有任何意义,因此C++没有提供访问引用本身地址的方法。引用的地址就是它所引用的变量或者对象的地址,对引用的地址所做的操作就是对被引用的变量或对象的地址所做的操作。指针是地址,指针变量要存储地址值,因此要占用存储空间,我们可以随时修改指针变量所保存的地址值,从而指向其他的内存。
引用和指针变量的内存模型如下图所示:
在编写程序时,很少直接使用引用,即用一个变量来初始化一个引用(int a; int &b=a),如果这么做,通过变量和引用都可以修改同一块内存的内容,在程序中,就很容易出现问题,不知道此时内存中的值到底是多少了。
引用多数用在函数的形参定义上,在调用函数传参时,我们经常使用指针传递,一是避免在实参占较大内存时发生值的复制,二是完成一些特殊的作用,例如,要在函数中修改实参所指向内存中的内容。同样,使用引用作为函数的形参也能完成指针的功能,在有些情况下还能达到比使用指针更好的效果。
下面,我们以一段程序的讲解作为引用这一小节的结束。
例:
- #include <iostream.h>
- //change函数主要用来交换a和b的值
- void change(int& a,int& b);
- void main()
- {
- int x=5;
- int y=3;
- cout<<"original x="<<x<<endl;
- cout<<"original y="<<y<<endl;
- change(x,y); //此处如果用指针传递,则调用change(&x, &y),这样很容易让人迷惑,不知道交换的是x和y的值,还是x和y的地址?此处用引用,可读性就比指针要好
- cout<<"changed x="<<x<<endl;
- cout<<"changed y="<<y<<endl;
- }
- /*在change()函数的实现中,我们采用了一个小算法,完成了a和b值的交换,读者下来可以仔细研读,细细体味一下(读者还可以采用其他的方法,当然也可以直接使用通常的实现,定义一个临时变量,完成a和b值的交换)*/
- void change(int& a,int& b)
- {
- a=a+b;
- b=a-b;
- a=a-b;
- }
【编辑推荐】