C++引用
一、概述
在C++中,变量的“引用”就是对变量起别名,因此引用也称为别名。与C语言中的typedef有很大区别,不要混淆:
1、typedef是对变量类型起别名,如整型,结构体类型等。例:typedef int datatype;---datatype就等于int。
2、引用则是对变量起别名。比如int a; ----引用是对变量a起别名,而不是对int。
二、引用格式
类型 &引用名 = 已定义的变量名
例:int a=1; int &b = a;
这里对a起了个别名叫b,b就是a。&在这里不代表取址符,而应该叫引用符。举个生活中的例子,我们给王明取了个绰号叫小明,那么小明就是王明,是同一个人。注意:引用变量的类型必须与已定义的变量的类型一致。不能int a=1; char &b=a;
三、说明
1、引用不是一种独立的数据类型,它必须与某一种数据类型的变量相联系。在声明引用的同时,必须对其初始化。
如:int i=1; int &j; j = i;这样是错误的。
2、 引用变量与被引用变量具有相同的地址,也可以理解为共用一块内存。因此其中一个值发生改变,都将改变。比如王明长高了1cm,那么我们不能说小明没有长高。
3、可以多重引用,也就是说可以给别名起别名。
如:int i=1; int &j=i; int &k=j; 这样,j和k都是i的别名,当然也可以说k是j的别名。
4、可以对指针起别名。
如:int *p; 实际上可以将变量p看成是“int *”类型的,那么,对其引用也必须使用int *型的别名。 例:int *&q=p;
四、引用的应用
1、引用作为函数参数
C++调用函数时,传递函数参数一共有三种情况:(1)将变量名作为函数参数:传递给形参的是实参变量的值,即“传值调用”。因为形参和实参占用不同的内存空间,所以传值调用在函数执行期间形参值发生变化并不会影响实参的值。即传值调用是单向的。
例:
void swap(int a, int b) { int tmp; tmp = a; a = b; b = tmp; }
调用:swap(a, b);并不能交换a与b的值。
(2)指针变量作为函数参数:传给形参的是实参的地址,即“传址调用”。这种雕鹰方式,形参和实参共用一个内存单元,所以是能够实现函数内部对实参的值产生影响。即传址调用是双向的。例:
void swap(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; }
调用:swap(&a, &b);能够交换a与b的值。
(3)引用作为函数参数:把变量的引用作为函数参数,传送变量的别名。这时,传给形参的也是实参的地址,也属于“传址调用”。
例:
void swap(int &a, int &b) { int tmp; tmp = a; a = b; b = tmp; }
调用:swap(a, b);能够交换a与b的值。
2、使用引用返回函数值
一般情况下,我们调用有返回值的函数通常是放在赋值运算符的右边,即函数返回值作为右值。使用引用返回函数的值,可将函数调用作为左值。
五、扩展说明例:/* test1.cpp */ #include <iostream> using namespace std; int a[5] = {1, 2, 3, 4, 5}; int &arr(int i) { return a[i]; } int main(void) { cout<<arr(3)<<endl; // 输出a[4]的值 arr(3) = 10; // 相当于将a[4]赋值为10。 cout<<arr(3)<<endl; return 0; }
输出结果:410
1、不允许使用void型的引用。
如:void &b = a;是错误的。
2、不能对整个数组引用,可以对数组中的某个元素进行引用。
例:
int a[3]={1, 2, 3};
int &b[4]=a;
错误!数组名a只代表数组a首元素的地址,其本身不是一个占有内存空间的变量。
3、不能对引用进行引用。
例:
int a=1;
int &&b=a;错误!
4、不能建立引用类型的指针,但是可以对指针进行引用。
例:
int a=1; int &*p=a;// 错误!
int *p; int *&q=p; // 正确!
5、可以将引用的地址赋给指针。
例:
int a=1;
int &b=a; // 这里的“&”是引用符int *p=&b; // 这里的“&”是取址符注意区分两个“&”不同的含义。
6、可以使用const对引用加以限定,不允许修改该引用的值。
例:
int a=1;
const int &b=a;b=2; // 错误!被const修饰的变量不允许改变。
但是!但是!我们可以通过修改a的值来间接地修改b的值,也就是说,若a=3;此时a与b的值都是3。