引用的概念
变量的引用就是变量的别名,&是“引用声明符”,假如有一个变量a,想给它起一个别名b,则:
int a;
int &b=a;
对变量声明一个引用,并不另开辟存储单元,b和a都代表同一变量单元。
在声明一个引用的同时,必须同时使之初始化,即声明它代表哪一个变量。
在声明一个变量的引用之后,在本函数执行期间,该引用一直与代表的变量相联系,不能再作为其他变量的别名。
引用的简单实用
<例1>了解引用和变量的关系
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a = 10;
int& b = a;
a = a * a;
cout <<setw(5)<< a <<setw(5)<<b<<endl;
b = b / 5;
cout <<setw(5)<< b <<setw(5)<< a;
return 0;
}
可以看出因为引用并未开辟存储空间,所以引用的值与变量的值始终相等。
关于引用的简单说明
- 引用并不是一种独立的数据类型,它必须与某一种类型的数据相联系,声明引用时,必须指定它代表的是哪个变量,即对它初始化。
- 引用与其代表的变量共享同一内存单元,系统并不为引用另外分配存储空间。实际上,编译系统使引用和其代表的变量具有相同的地址。
- 当&a的前面有类型符时(如int &a),它必然是对引用的声明,如果前面没有类型符(如p=&a),此时的&是取地址运算符。
- 对引用的初始化可以用一个变量名,也可以用另一个引用。
- 引用在初始化后不能再被重新声明为另一个变量的别名。
- 实际上C++中很少使用独立变量的引用,如果要是用某一个变量,直接使用它的原名。
将引用作为函数参数
C++之所以增加”引用“,主要是利用他作为函数参数,以扩充函数传递数据的功能。
C++调用函数时,有两种传递书的方式,一种是常用的方法:将实参的值传递给形参,称为传值方式调用;另一种是将实参的地址传递给引用型形参,称为引用方式调用。
<例1>无法实现两个变量的值互换的程序
#include <iostream>
#include<iomanip>
using namespace std;
void swap(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int i = 3, j = 5;
swap(i, j);
cout << setw(5) << i << setw(5) << j << endl;
return 0;
}
<例2>使用指针变量作形参,实现两个变量的值互换
#include <iostream>
#include<iomanip>
using namespace std;
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int i = 3, j = 5;
swap(&i, &j);
cout << setw(5) << i << setw(5) << j << endl;
return 0;
}
<例3>利用“引用形参”实现两个变量的值互换
#include <iostream>
#include<iomanip>
using namespace std;
void swap(int &a,int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int i = 3, j = 5;
swap(i, j);
cout << setw(5) << i << setw(5) << j << endl;
return 0;
}
对引用的进一步说明
- 不能建立void型的引用
void &a=9;
- 不能建立引用的数组
char c[6]="hello";
char &rc[6]=c;
数组名c只代表数组首元素的地址,本身并不是一个占有存储空间的变量。
- 可以将变量的引用的地址赋给一个指针,此时指针指向的是原来的变量。
int a=3;
int &b=a;
int *p=&b;
相当于
int *p=&a;
但是不能定义指向引用类型的指针变量
int *p=& b;
- 可以建立指针变量的引用
int i=5;
int *p=&i;
int * &pt=p;
- 可以用const对引用加以限制,不允许改变该引用的值
int i=5;
const int * &a=i;
a=3; //企图改变引用的值,错误
//但是const并不阻止改变引用所代表的的变量的值
i=3; //合法
这一特征在使用引用作为函数形参时是有用的,因为有时希望保护形参的值不被改变。
- 可以用常量或者表达式对引用进行初始化,但此时必须用const进行声明
int i=5;
const &a=i+3;
用这种方法不仅可以用表达式对引用进行初始化,还可以用不同类型的变量对之初始化(要求能赋值兼容的类型)
double i=3.1415;
const int &a=d; //此时输出a的值将是3而不是3.1415
如果在上面声明引用时不用const,则会发生错误。