引用
在学习C++的过程中,对引用总是有点迷惑。看了一下资料和博客,根据自己的了解,总结一下:
1)概念
引用就是某一变量的别名,对引用的操作与对变量直接操作完全一样。
2)定义格式
<类型> & <引用名> (<变量名>)
OR
<类型> &<引用名> = <变量名>
如:
int a = 3;
int &m = a; //m是引用,它是变量a的别名
m = m+ 5 ; //实际上就是在被引用者上的操作
3)说明 (int &m = a;)
a)&在这里不是求地址运算,而是起到标志作用。
b)类型标识符是指目标变量的类型。
c)声明引用时,必须同时对其进行初始化。
d)引用声明完毕后,相当于目标变量有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
e)声明一个引用,不是新定义一个变量,它只是表示该引用名是目标变量名的一个别名,他本身不是一种数据类型,因此引用本身不占内存单元,系统也不会给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&m与&a相等。
f)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。
g)可以将一个引用赋给某个变量,如:
int n = m; //n具有m引用的变量a的值,即8
h)可以将指针p指向a变量的地址,如:
int *p = &m;
i)指针通过地址间接访问某个变量,而引用时通过别名直接访问某个变量。
4)引用作为参数的应用
引用的一个重要作用就是作为函数的参数。C语言中的函数参数传递是传值,通过指针实现传址。
但为简化传址调用,我们用引用。引用调用将实际的实参传给函数,而不是实参的一个拷贝(传值调用)。
如:
void swap(int &p1, int &p2) //形参都是引用 { int p; p = p1; p1 = p2; p2 = p; } void main() { int a = 5, b = 10; swap(a, b); //直接以变量a和b作为实参调用swap函数 cout<<a<<' '<<b; }
函数原型:void swap(int &, int &)指定swap的参数是通过引用传递的。在swap被调用后,swap函数体中的p1和p2直接对应main函数中的a和b的存储空间。函数swap并不是对a和b的拷贝进行操作,而是直接操作a和b本身。
注意:输入输出流作为参数传递时,必须用引用调用。
例如:将字符串c输出n遍到文件out,在输出一个换行符。out决不能使用传值调用。
1 void print_row(ofstream& out, char c, int n) 2 { 3 for(int i = 0; i < n; i++) 4 out<<c; 5 out<<'\n'; 6 }
®C++中,在默认的情况下是传值返回,如:
1 int val1() 2 { 3 //... 4 return i; 5 }
调用函数:j = val1();则i的值将拷贝到临时存储空间,然后再拷贝到 j,如下图所示:
®使用引用返回的函数返回的是一个实际单元,因次必须保证函数返回时该单元仍然有效。例如:
1 int &符() 2 { 3 int i; 4 //...... 5 return i; //error 6 }
错误在于当 f 返回 i 时,i 已经不存在了(因为i是局部变量)。因此,应改为传值返回。