引用

  在学习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<<'
';
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是局部变量)。因此,应改为传值返回。

 

原文地址:https://www.cnblogs.com/dormant/p/4973016.html