• C++引用


    转载请注明出处:http://www.cnblogs.com/Ljian1992/p/4198015.html

    有错误的地方或者有更好的见解,欢迎谈论。我的邮箱:Ljian1992@126.com

    概述

        变量是一段实际的连续的存储空间的别名,程序中通过变量来申请并命名存储空间,并且通过变量的名字可以使用该存储空间。在C语言中一段实际的连续的存储空间只能有一个别名(指针不能当作别名),但在C++中一段实际的连续的存储空间却可以有多个别名,这一种实现的机制即为引用。引用是一个已存在的变量的别名, 对引用操操作等于对变量的操作

    语法

        type &name = var;

         Tips:

            1.引用必须在定义时初始化,并且初始化后无法再引用其它变量

    例子

    int a = 4;
    int &b = a;

     image

    引用本质

        引用在编译器的内部是用常量指针来实现的,因此引用既是指针,它是会占用内存空间的,它所占的内存空间的大小和指针所占的内存空间的大小是一致的。但在使用引用的时候,它会自动加上解引用符号。由于引用的本质是常量指针,故初始化后无法再改变它,也就是无法再引用其它变量了。

        C++把引用的本质隐藏了起来,让人感觉到它就是一个变量的新名字,站在使用者的角度,我们也没必要把引用当成一个常量指针,引用与指针并没有任何关系。但当使用引用程序出错后,可以从这一角度去分析为什么出错

    测试代码

    #include <stdio.h>
    

    struct references
    {   

    int &ref1;     
    char &ref2;
    };
        
    struct poiter
    {     
    int *poiter1;     
    char *poiter2;
    };
        
    int main (void)
    {  
    char a;  
    char &b = a;
        
      //通过常量指针来模拟引用   
      char *const c = &a;   #define c (*c)         
      printf ("sizeof(a) = %d
    ",(int)sizeof (a));
      printf ("sizeof(b) = %d
    ",(int)sizeof (b));
      printf ("sizeof(c) = %d
    ",(int)sizeof (c));
      
      printf ("a addr: %p
    ", &a);   printf ("b addr: %p
    ", &b);
      printf ("c addr: %p
    ", &c);     //证明引用占内存空间的大小和指针所占的内存空间大小是一致的  
      printf ("sizeof(struct references) = %d
    ",(int)sizeof (struct references));
      printf ("sizeof(struct poiter) = %d
    ",(int)sizeof (struct poiter));    
    return 0;
     }

    引用相对于指针的优势

      1.引用可以使到函数的返回值作为左值使用

         返回栈变量的引用:由于栈空间的变量,会随着函数生命周期的结束而销毁,因此是栈变量是不能够返回引用作为左值使用的,也不初始化其它 引用

         返回静态变量或全局变量的引用:由于静态变量或全局变量的生命周期是程序的生命周期,故其返回值可以作为左值来使用,并且能够初始化其它引用

    #include <stdio.h>
    

    int & ret_reference(void)
    {
    static int c = 0;

    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> c;
    

    }

    int main(int argc, char *argv[])
    {

    printf (</span><span style="color: #800000;">"</span><span style="color: #800000;">static c = %d
    </span><span style="color: #800000;">"</span><span style="color: #000000;">, ret_reference ());
    ret_reference() </span>= <span style="color: #800080;">20</span>;  <span style="color: #008000;">//</span><span style="color: #008000;">修改静态局部变量为20</span>
    printf (<span style="color: #800000;">"</span><span style="color: #800000;">static c = %d
    </span><span style="color: #800000;">"</span><span style="color: #000000;">, ret_reference ());
    
    
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Press enter to continue ...</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    getchar();  
    </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
    

    }

    2.引用可以使到程序更容易理解

    void swap(int& a, int& b)
    {     int t = a;     a = b;     b = t;
    }
    调用: swap (a, b);
    

    void swap_poiter (int *a, int *b)
    {    
    int tmp = a;     a = b;     b = tmp;
    }
    调用:swap_poiter (
    &a, &b)

    同样是交换两个整形的数据,用引用来实现明显比用指针来实现更容易理解,也更符合人的思维习惯

    引用与三目运算符

    1.三目运算符返回变量的引用,若无变量则返回常量

    2.三目运算符可以返回变量本身,故可以作为左值来使用

    3.三目运算符可能的返回值中如果有一个常量值,则不能作为左值来使用

    #include<stdio.h>
    int main (void)
    {
        int a = 1;
        int b = 2;
        (a < b? a: b) = 3;
        printf ("a = %d
    b = %d
    ", a, b);
    
    (a</span>&lt;b? a: <span style="color: #800080;">3</span>) = <span style="color: #800080;">3</span>;   <span style="color: #008000;">//</span><span style="color: #008000;">报错 </span>
    (a&lt;b? <span style="color: #800080;">3</span>: <span style="color: #800080;">2</span>) = <span style="color: #800080;">3</span>;   <span style="color: #008000;">//</span><span style="color: #008000;">报错 </span>
    printf (<span style="color: #800000;">"</span><span style="color: #800000;">press enter to continue.......
    </span><span style="color: #800000;">"</span><span style="color: #000000;">);
    </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
    

    }

    ---恢复内容结束---

  • 相关阅读:
    洛谷 P2384 最短路
    洛谷 P2910 [USACO08OPEN]寻宝之路Clear And Present Danger
    POJ 3264 Balanced Lineup
    洛谷 P1892 团伙
    洛谷 P1724 东风早谷苗
    P1129 [ZJOI2007]矩阵游戏
    P1894 [USACO4.2]完美的牛栏The Perfect Stall
    Poj 3041 Asteroids
    P3377 【模板】左偏树(可并堆)
    P1613 跑路
  • 原文地址:https://www.cnblogs.com/Ljian1992/p/4198035.html
Copyright © 2020-2023  润新知