zoukankan      html  css  js  c++  java
  • 引用

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

     

  • 相关阅读:
    【题解】【字符串】【BFS】【Leetcode】Word Ladder
    Python CSV模块处理文件读写
    【题解】【排列组合】【回溯】【Leetcode】Generate Parentheses
    【题解】【链表】【Leetcode】Linked List Cycle II
    【题解】【排列组合】【回溯】【Leetcode】Gray Code
    【题解】【位操作】【Leetcode】Single Number II
    【题解】【数组】【查找】【Leetcode】Search Insert Position
    JAVAWEB的Listener
    Hibernate的检索方式--查询数据的方式
    Hibernate的批量处理和分页技术、投影技术
  • 原文地址:https://www.cnblogs.com/dormant/p/4973016.html
Copyright © 2011-2022 走看看